问题描述 :
明明学习数学已经有很多年了,对各种各样的数学问题都有研究。有一天,明明的爸爸问明明说:“明明,你觉得你对数字敏感吗?”明明毫不犹豫地回答:“那当然,非常敏感。”于是明明的爸爸就说:“好,那我问你一个问题,如果有一个个位数为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
完整C++代码
因为题目要求就9个,所以可以直接枚举出所有结果,不然每次都要计算很久,被注释掉的代码就是计算过程
#include <bits/stdc++.h>
using namespace std;
// string转int
int s2i(string s) {
stringstream ss;
ss << s;
int num;
ss >> num;
return num;
}
// 判断是否为k倍
int isTimes(int num, int n) {
// 个数不是7直接pass
if (num % 10 != 7) return 0;
string s = to_string(num);
int len = s.size();
// 将7放到开头
string t = s[len - 1] + s.substr(0, len - 1);
int res = s2i(t);
// 返回是否是倍数
return num * n == res;
}
int main()
{
int num[10] = {0, 7, 0, 0, 179487, 142857, 0, 0, 0, 0};
// for (int t = 1; t <= 9; t++) {
// for (int i = 1; i <= 1000000; i++) {
// if (isTimes(i, t)) {
// num[t] = i;
// break;
// }
// }
// }
int n;
while (cin >> n) {
if (num[n] != 0) cout << num[n] << endl;
else cout << "No" << endl;
}
return 0;
}
😋欢迎大伙私信或者评论区交流讨论😋