题目如下:
这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由1组成的数字,比如1 11 111 1111等。传说任何一个光棍都能被一个不以5结尾的奇数整除。比如,111111就可以被13整除。 现在,你的程序要读入一个整数x,这个整数一定是奇数并且不以5结尾。然后,经过计算,输出两个数字:第一个数字s,表示x乘以s是一个光棍,第二个数字n是这个光棍的位数。这样的解当然不是唯一的,题目要求你输出最小的解。
提示:一个显然的办法是逐渐增加光棍的位数,直到可以整除x为止。但难点在于,s可能是个非常大的数 —— 比如,程序输入31,那么就输出3584229390681和15,因为31乘以3584229390681的结果是111111111111111,一共15个1。
输入格式:
输入在一行中给出一个不以5结尾的正奇数x(<1000)。
输出格式:
在一行中输出相应的最小的s和n,其间以1个空格分隔。
本题一开始没思路,后来知道了要模拟的是手工除法,就开始敲代码了,但是结果显示不对,我自己测试又好像没有问题,有没有dl来指一下错误
#include<stdio.h>
#include<windows.h>
void search(int x,int *cnt, int a[]);
int bytee(int number);
int main(){
int x,cnt;
int *p = &cnt;//声明一个p指向cnt,用来计算光棍个数
int a[cnt];//这里用了变量数组,编译器没报错,运行结果好像也没问题,但是我没有测试完,pta上面显示部分正确
scanf("%d",&x);
search(x,p,a);
int i,add = 0;
for(i=0;i<cnt;i++){
add += a[i];
//创建额add变量是判断a[i]前面是否为0的,如果为0就不输出,避免输出的数字前面带0
if(add != 0){
printf("%d",a[i]);
//一个一个地输入存在数组里面的每一位数字
}
}
printf(" %d",cnt);
system("pause");
return 0;
}
void search(int x,int *p,int a[]){
int i,s = 1;
*p = 0;
for( i=0; ; i++ ){
a[i] = s/x;
//存储每一位商的值
int mid = s;
//声明中间量存储s改变之前的值,因为要拿这个值来判断是否继续执行循环
s = (s % x)*10+1;
//这是每次的余数,因为是1111...,所以每次乘十再加一
*p = *p + 1;
//*p指向cnt,是用来计管滚数量的
if(mid % x == 0){
break;
}
//这个条件语句在mid刚好被x整除的时候退出循环
}
}