这里所谓的“光棍”,并不是指单身汪啦~ 说的是全部由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个空格分隔。
输入样例:
31
输出样例:
3584229390681 15
#include<stdio.h>
#include<stdlib.h>
typedef struct{
int number[250];
int lenth;
}integerT;
int ORD(int x,int n);
integerT IntDivide(integerT a,int b);
integerT SingleNumber(int lenth);
void PrintInt(integerT n);
main()
{
int ord,n;
integerT quotient;
scanf("%d",&n);
ord=ORD(10,n*9);
PrintInt(IntDivide(SingleNumber(ord),n));
printf(" %d\n",ord);
}
int ORD(int x,int n)
{
int ord=1,a;
x=x%n;
a=x;
while(a!=1){
a=(a*x)%n;
ord++;
if(ord>=n) return -1;
}
return ord;
}
integerT IntDivide(integerT a,int b)
{
int i,r=0;
integerT quotient;
quotient.lenth=a.lenth;
if(b==0) exit(0);
for(i=a.lenth-1;i>=0;i--){
quotient.number[i]=(r*10000+a.number[i])/b;
r=(r*10000+a.number[i])%b;
}
if(quotient.number[quotient.lenth-1]==0) quotient.lenth--;
return quotient;
}
integerT SingleNumber(int lenth)
{
int i,q,r;
integerT singlenum;
q=lenth/4;
r=lenth%4;
if(r){
singlenum.lenth=q+1;
singlenum.number[q]=0;
for(i=0;i<r;i++){
singlenum.number[q]=singlenum.number[q]*10+1;
}
}else{
singlenum.lenth=q;
}
for(i=0;i<q;i++){
singlenum.number[i]=1111;
}
return singlenum;
}
void PrintInt(integerT n)
{
int i;
for(i=n.lenth-1;i>=0;i--){
if(i==n.lenth-1){
printf("%d",n.number[i]);
}else{
printf("%04d",n.number[i]);
}
}
}
该博客探讨了如何找到一个不以5结尾的奇数x,使得x乘以一个特定的数s得到一个全由1组成的数字(光棍数),并要求输出s和该光棍数的位数n,同时保证s和n是最小的。以31为例,输出为3584229390681 15,意味着31乘以3584229390681得到15位的光棍数111111111111111。
395

被折叠的 条评论
为什么被折叠?



