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秒 | 64M | 0 |
测试用例 2 | 以文本方式显示
|
以文本方式显示
|
1秒 | 64M | 0 |
测试用例 6 | 以文本方式显示
|
以文本方式显示
|
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