首页 > 其他分享 >北理工39【中学】整数问题

北理工39【中学】整数问题

时间:2022-11-22 08:44:30浏览次数:61  
标签:10 39 int counter digit 整数 北理工 start ret

39. 【中学】整数问题

成绩 5 开启时间 2022年10月17日 星期一 08:00
折扣 0.8 折扣时间 2022年11月13日 星期日 23:55
允许迟交 关闭时间 2022年11月20日 星期日 23:55

请输出满足以下条件的 n 位正整数的个数:

要求该n位整数的从高位开始前 1 位可以被 1 整除,前 2 位可以被 2*2 整除,前 3 位可以被 3*3 整除,前 4 位可以被 4*4 整除......。即该整数前 k 位都可被 k 平方整除。

例如:n=1,则符合条件的1位正整数为1~9,输出答案 9。n=2,符合条件的正整数为:12, 16, 20, 24, 28, 32, 36, 40, 44, 48, 52, 56, 60, 64, 68, 72, 76, 80, 84, 88, 92, 96,则输出答案22。当n=4时,2432就是一个符合题意的整数。第一位 2 可以被1整除;前2位24可以被4整除;前3位243可以被9整除;整个4位2432可以被16整除。

输入:
  n(0<=n<9)

输出:
    符合该条件的n位正整数的数量

(本题目为软件学院2007年保研学生初试上机试题。本题可以不用数组)

  测试输入 期待的输出 时间限制 内存限制 额外进程
测试用例 1 以文本方式显示
  1. 1↵
以文本方式显示
  1. 9↵
1秒 64M 0
测试用例 2 以文本方式显示
  1. 2↵
以文本方式显示
  1. 22↵
1秒 64M 0
测试用例 6 以文本方式显示
  1. 8↵
以文本方式显示
  1. 0↵
1秒 64M 0

 

第一次看错了题目,该整数前 k 位都可被 k 平方整除。看成了该整数前 k 位都可被 k 次方整除

写出了这样的代码

错误代码
#define _CRT_SECURE_NO_WARNINGS 1    
#include <stdio.h>  
#include <stdbool.h>
#include <ctype.h>
#include <math.h>
int num_of_digit(int i);
int main(void)
{
    /*
    读入位数n
    计算n^n的大小
    start = 10^(n-1)/n^n
    end = 10^n/n^n
    从start到end,逐步删去最后一个数字/
    判断是否可被(n-1)^(n-1)取余
    */
    int n;
    scanf("%d", &n);
    int counter = 0;
    if (n > 9)
        counter = 0;    
    else
    {
        int ret = 1; /*ret = n^n*/        
        for (int i = 0; i < n; i++)
            ret *= n;        
        int arr[60] = { 0 };
        int start = (int)pow(10, n - 1) / ret;
        int end = (int)pow(10, n) / ret;
        /*从start开始,到end结束*/
        int i;
        for ( i = 0; start <= end; i++) {
            arr[i] = start++ * ret;            
        }
        for (int j = 0; j < i; j++)
            printf("%d ", arr[j]);
        putchar('\n');

        for (int j = 0; j < i ; j++) {
            if (n != num_of_digit(arr[j])) continue;
            while (arr[j] >= 10) {
                arr[j] /= 10;
                int digit = num_of_digit(arr[j]);
                if (arr[j] % (int)pow(digit, digit) == 0)
                    ;
                else
                    break;
            }
            if (arr[j] < 10 && arr[j]!=0)
                counter++;
        }           
    }
    printf("%d\n", counter);
    return 0;
}
int num_of_digit(int i) 
{
    int counter = 0;
    while (i != 0) {
        i /= 10;
        counter++;
    }
    return counter;
}
//void check()
//{
//    for (int j = 0; j <= i; j++) {
//        while (arr[j]<10) {
//            arr[j] /= 10;
//            int digit = num_of_digit(arr[j]);
//            if (arr[j] % (int)pow(digit, digit) == 0)
//                ;
//            else continue;
//        }
//        if (arr[j] < 10)
//            counter++;
//    }
//}

 

后来改正

正确代码

#define _CRT_SECURE_NO_WARNINGS 1    
#include <stdio.h>  
#include <stdbool.h>
#include <ctype.h>
#include <math.h>
int num_of_digit(int i);
int main(void)
{
    /*
    读入位数n
    计算n^2的大小
    start = 10^(n-1)/n^2
    end = 10^n/n^2
    从start到end,逐步删去最后一个数字/
    判断是否可被(n-1)^2取余
    */
    int n;
    scanf("%d", &n);
    int counter = 0;    
    int ret = n*n;    
    int start = (int)pow(10, n - 1) / ret;
    int end = (int)pow(10, n) / ret;
    /*从start开始,到end结束*/     
    int temp = start*ret;
    for (; start<=end ; temp = ++start * ret) {
        /*printf("%d ", temp);
        putchar('\n');*/
        if (n != num_of_digit(temp)) continue;
        while (temp >= 10) {
            temp /= 10;
            int digit = num_of_digit(temp);
            if (temp % (int)pow(digit, 2) == 0)
                ;
            else
                break;
        }
        if (temp < 10 && temp !=0)
            counter++;        
    }     
    printf("%d\n", counter);
    return 0;
}
int num_of_digit(int i) 
{
    int counter = 0;
    while (i != 0) {
        i /= 10;
        counter++;
    }
    return counter;
}
精简后代码,最终提交上去的版本
#define _CRT_SECURE_NO_WARNINGS 1    
#include <stdio.h>  
#include <math.h>
int num_of_digit(int i);
int main(void)
{
    int n;
    scanf("%d", &n);
    int counter = 0;    
    int ret = n*n;    
    int start = (int)pow(10, n - 1) / ret;
    int end = (int)pow(10, n) / ret;        
    int temp = start*ret;
    for (; start<=end ; temp = ++start * ret) {        
        if (n != num_of_digit(temp)) continue;
        while (temp >= 10) {
            temp /= 10;
            int digit = num_of_digit(temp);
            if (temp % (int)pow(digit, 2) != 0)
                break;            
        }
        if (temp < 10 && temp !=0)
            counter++;        
    }     
    printf("%d\n", counter);
    return 0;
}
int num_of_digit(int i)
{
    int counter = 0;
    while (i != 0) {
        i /= 10;
        counter++;
    }
    return counter;
}

 

 

标签:10,39,int,counter,digit,整数,北理工,start,ret
From: https://www.cnblogs.com/alien-han/p/16914026.html

相关文章

  • 39.组合总和
    给你一个 无重复元素 的整数数组 candidates 和一个目标整数 target ,找出 candidates 中可以使数字和为目标数 target 的所有 不同组合 ,并以列表形式返回。你......
  • New User's Guide to Managing Cisco MDS Zones via CLI
    NewUser'sGuidetoManagingCiscoMDSZonesviaCLI20October2009TowardtheendofAugust2009,Ipostedanarticleon howtoconfigureCiscoMDSzonesv......
  • day39并发编程
    多进程实现TCP服务端并发importsocketfrommultiprocessingimportProcessdefget_server():server=socket.socket()server.bind(('127.0.0.1',8080))......
  • 【Azure 应用服务】Azure Powershell Function 出错 The term 'Connect-AzAccount' is
    问题描述在AzureFunction中,执行Powershell的Function脚本时,先后出现1:[Error]ERROR:Theterm'Connect-AzAccount'isnotrecognizedasanameofacmdlet,functio......
  • 396. 矿场搭建
    题目链接396.矿场搭建煤矿工地可以看成是由隧道连接挖煤点组成的无向图。为安全起见,希望在工地发生事故时所有挖煤点的工人都能有一条出路逃到救援出口处。于是矿主决......
  • Android错误之--Error retrieving parent for item: No resource found that matches
    改正错误(虽然内容较少,但是还是选择单独占用一篇)这个错误,可以说是困扰了我好久,然后就看到可以改变一下使用的Android版本,改成Android4.0,然后就去试了试,发现真的就好了耶!......
  • 739.每日温度 daily-temperatures
    问题描述739.每日温度解题思路考虑利用单调栈(monotonestack)来进行处理,如果栈为空或者要入栈的元素小于栈顶元素,那么该元素入栈,否则弹出栈顶元素直到栈为空,或者要入栈......
  • 【转载】python的魔法方法———A Guide to Python's Magic Methods
    原文地址:https://rszalski.github.io/magicmethods/     =========================================================== AGuidetoPython'sMagicMetho......
  • 每日算法之调整数组顺序使奇数位于偶数前面(二)
    JZ81调整数组顺序使奇数位于偶数前面(二)描述输入一个长度为n整数数组,数组里面可能含有相同的元素,实现一个函数来调整该数组中数字的顺序,使得所有的奇数位于数组的前面......
  • original: Error: Unknown storage engine 'InnoDB'
    问题Nodejs工程下,用sequelize向一个现有的MySQL数据库中初始化数据时报错,如题:original:Error:Unknownstorageengine'InnoDB'ENVMySQL5.6Sequelize:^6......