13 T的倍数N
作者: 程裕强 时间限制: 10S章节: 循环
问题描述 :
明明学习数学已经有很多年了,对各种各样的数学问题都有研究。有一天,明明的爸爸问明明说:“明明,你觉得你对数字敏感吗?”明明毫不犹豫地回答:“那当然,非常敏感。”于是明明的爸爸就说:“好,那我问你一个问题,如果有一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位(如127变成712),要求这样得到的一个新的数是原数的T倍。若我现在把自然数T告诉你,你能求出最小的符合条件的自然数N吗?”
明明觉得这个问题很简单,只要按从小到大的顺序把所有是7结尾的自然数找出来,然后交换位置,再除一下,看看倍数是不是T倍就可以了。明明回答爸爸说:“这个问题很简单,来考我吧。”于是明明的爸爸就给了明明一个数字2,让他开始动手寻找。但是,使明明意想不到的是,他找了很久很久,始终没有找到想要的那个数,而当他到查到1000007时,需要的那个数还是没有出现,于是就放弃了。他觉得靠手工查找的话,是无法快速找到的。因此,明明求助于你,请你帮他写一个程序,来解决这个相当棘手的问题。但是他也给了你另外一个条件,如果找到超过1000000时还是没有找到需要的那个数的话,就停止寻找。
明明的问题可以归结为:对于一个个位数为7的自然数N,把它的个位数移到最高位,其余各位均右移一位,要求这样得到的一个新的数是原数的T倍。现给出这个自然数T,求满足这个要求的最小的自然数N。若在[1,
1000000] 的范围内没有找到N,则输出“No”。 输入说明 :你写的程序要求从标准输入设备(通常,键盘为标准输入设备)中读入测试数据作为你所写程序的输入数据。标准输入设备中有多组测试数据,每组测试数据仅占一行,每行仅有一个自然数T(1≤T≤9)。每组测试数据与其后一组测试数据之间没有任何空行,第一组测试数据前面以及最后一组测试数据后面也都没有任何空行。
输出说明 :对于每一组测试数据,你写的程序要求计算出一组相应的运算结果,并将这一组运算结果作为你所写程序的输出数据依次写入到标准输出设备(通常,显示屏为标准输出设备)中。每组运算结果输出一个自然数N或“No”,不包括双引号。每组运算结果单独形成一行数据,其行首和行尾都没有任何空格,每组运算结果与其后一组运算结果之间没有任何空行,第一组运算结果前面以及最后一组运算结果后面也都没有任何空行。
输入范例 : 5 3 8 输出范例 : 142857 No No
代码:
/*
T13 T的倍数N
*/
#include<stdio.h>
#define MAX_SIZE 7
int isTarget(int, int);
int main() {
int T = 0;
int i = 0;
while (scanf("%d", &T) != EOF) {
for (i = 1; i <= 1000000; i++) {
if ((i % 10 == 7) && (isTarget(i, T) == 1)) {
printf("%d\n", i);
break;
}
}
if (i == 1000001) {// 没找到
printf("No\n");
}
}
return 0;
}
// 判断是否为目标数
int isTarget(int n, int T) {
int tras = 0;// 转换后的数
int stack[MAX_SIZE] = {0};
int top = -1;
int temp = n;// 暂存n
tras += n % 10;
n /= 10;
while (n) {// 将n的各位数字保存到栈中
stack[++top] = n % 10;
n /= 10;
}
while (top != -1) {// 合成新数
tras = tras * 10 + stack[top];
top--;
}
if ((double)tras / (double)temp == T) {
return 1;
}
else {
return 0;
}
}
问题不算难,但是我在两个地方有粗心,因为这个卡了有点久
- 忘记暂存n了
由于n在运行过程中会改变,但是最后又需要用到原来的n,所以如果不另存的话不仅结果不对,还会发生除零错误导致程序崩溃
即使另存了n结果也不一定正确,因为tras为整数,temp也为整数,这样tras/temp的结果必然也为整数,这与实际情况不一定相符,所以应该在49行的tras和temp前面都加上double进行强转才能保证结果正确