| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1124 人关注过本帖
标题:[请教]大家做做NOIP2005的一道初赛试题
取消只看楼主 加入收藏
多维数组
Rank: 1
等 级:新手上路
帖 子:238
专家分:0
注 册:2006-8-16
收藏
 问题点数:0 回复次数:1 
[请教]大家做做NOIP2005的一道初赛试题

循环

【问题描述】

乐乐是一个聪明而又勤奋好学的孩子。他总喜欢探求事物的规律。一天,他突然对数的正整数次幂产生了兴趣。
众所周知,2的正整数次幂最后一位数总是不断的在重复2,4,8,6,2,4,8,6……我们说2的正整数次幂最后一位的循环长度是4(实际上4的倍数都可以说是循环长度,但我们只考虑最小的循环长度)。类似的,其余的数字的正整数次幂最后一位数也有类似的循环现象:
循环 循环长度
2 2、4、8、6 4
3 3、9、7、1 4
4 4、6 2
5 5 1
6 6 1
7 7、9、3、1 4
8 8、4、2、6 4
9 9、1 2
这时乐乐的问题就出来了:是不是只有最后一位才有这样的循环呢?对于一个整数n的正整数次幂来说,它的后k位是否会发生循环?如果循环的话,循环长度是多少呢?
注意:
1. 如果n的某个正整数次幂的位数不足k,那么不足的高位看做是0。
2. 如果循环长度是L,那么说明对于任意的正整数a,n的a次幂和a + L次幂的最后k位都相同。

【输入文件】

输入文件circle.in只有一行,包含两个整数n(1 <= n < 10^100)和k(1 <= k <= 100),n和k之间用一个空格隔开,表示要求n的正整数次幂的最后k位的循环长度。

【输出文件】

输出文件circle.out包括一行,这一行只包含一个整数,表示循环长度。如果循环不存在,输出-1。

【样例输入】

32 2

【样例输出】

4

【数据规模】

对于30%的数据,k <= 4;
对于全部的数据,k <= 100。


我好像连题目都没有看懂...

搜索更多相关主题的帖子: 初赛 试题 
2007-07-12 13:53
多维数组
Rank: 1
等 级:新手上路
帖 子:238
专家分:0
注 册:2006-8-16
收藏
得分:0 

我这里有一段C++的代码,但真是很难看,他的编程风格简直可以参加国际C混乱代码大赛了。
可以帮我解析一下吗?

//循环
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int d;
char str[255];
void chen(char *a,char *b)
{
char *c;
int i,j,k;
int l,l2;
l = strlen(a);
l2 = strlen(b);
c = (char *)malloc(sizeof(char)*(l+l2+1));
for(i = 0; i < l+l2+1; i++)
c[i] = '0';
int jin = 0;
for(i = l2-1; i >= 0; i--)
{
for(j = l-1; j >= 0; j--)
{
int temp = (a[j]-48) * (b[i]-48) + jin;
jin = 0;
if(temp >= 10)
{
jin = temp / 10;
temp = temp % 10;
}
c[i+j+1] += temp;
for(k = i+j+1; k > 0; k--)
if((c[k]-48)>=10)
{
c[k-1] += 1;
c[k] = c[k]-10;
}
else
break;
}
if(jin)
{
c[i+j+1] += jin;
for(int k = i+j+1; k > 0; k--)
if((c[k]-48)>=10)
{
c[k-1] += 1;
c[k] = c[k]-10;
}
else
break;
jin = 0;
}
}
if(jin)
c[0]+=jin;
else if(c[0]=='0')
{
memcpy(c,c+1,sizeof(char)*(l+l2-1));
c[l+l2-1] = '\0';
if(l+l2-1>d)
memcpy(str,c+l+l2-1-d,sizeof(char)*(d+1));
else
memcpy(str,c,sizeof(char)*(l+l2));
}
else
{
c[l+l2] = '\0';
if(l+l2>d)
memcpy(str,c+l+l2-d,sizeof(char)*(d+1));
else
memcpy(str,c,sizeof(char)*(l+l2+1));
}
free(c);
}
void chen(char *a,int n)
{
int l = strlen(a);
if(n==10)
{
a[l] = '0';
a[l+1] = '\0';
}
else
{
int jin = 0;
for(int i = l-1; i >= 0; i--)
{
int temp = (a[i]-48)*n+jin;
jin = temp / 10;
temp = temp % 10;
a[i] = temp+48;
}
if(jin)
{
memcpy(a+1,a,sizeof(int)*(l+1));
a[0] = jin+48;
}
}
return;
}
int main(void)
{
char n[255];
char a[255];
char b[255];
int l,i,j;
int xun[100];
scanf("%s %d",n,&d);
strcpy(a,n);
l = strlen(n);
for(i = 1; i <= 10; i++)
{
chen(a,n);
if(str[d-1]==n[l-1])
{
xun[0] = i;
break;
}
strcpy(a,str);
}
for(i = 2; i <= d; i++)
{
strcpy(b,a);
for(j = 1; j <= 10; j++)
{
chen(a,n);
if(str[d-i]==n[l-i])
{
xun[i-1]=j;
break;
}
chen(a,b);
strcpy(a,str);
}
if(j==11)
{
printf("-1\n");
return 0;
}
}
a[0] = '1';
a[1] = '\0';
for(i = 0; i < d; i++)
chen(a,xun[i]);
printf("%s\n",a);
return 0;
}


有事发邮件:tzp_1210@
2007-07-13 08:55
快速回复:[请教]大家做做NOIP2005的一道初赛试题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.016409 second(s), 8 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved