当前位置: 代码迷 >> C语言 >> [讨论]第五期题目,大家做做.
  详细解决方案

[讨论]第五期题目,大家做做.

热度:220   发布时间:2006-12-12 21:46:36.0
以下是引用senyee在2006-12-12 21:35:49的发言:
第一题的题意还是不怎么懂
英语水平有限.....
能介绍清楚点吗?


就是有个有序的数字1 12 123 1234 12345 123456…………
这样无限下去。且组合起来。

输入一个数,这个数表示在以上这个序列中的序号。然后输出相应序号的那个数。

比如:

输入:3 输出:2
输入:6 输出:3


----------------解决方案--------------------------------------------------------

我的想法是把每一个数对应有多少个数字保存起来.并且有下面的递推式:


a[i]=a[i-1]+i的位数.i!=0
a[i]=0; i==0
与此同时做while(num>a[i])num-=a[i];一次循环可以出来.
则循环退出时,num必定在某个a[i]范围内.此时我只要将从1到i所有的数字求出来b[j](j从1开始保存),我就知道num对应的数字了.
是b[num];

不知道这样的想法是否正确...


----------------解决方案--------------------------------------------------------
[CODE]#include <iostream>
using namespace std;
int main()
{
long long i,j,n;
bool tag;
while(cin>>n)
{
j=1,tag=false;
if(n%2)
{
for(i=1;i<=n;i++)
{
j<<=1;
if(j>n)
j%=n;
if(j==1)
{
tag=true;
break;
}
}
}
if(tag)
cout<<"2^"<<i<<" mod "<<n<<" = 1"<<endl;
else cout<<"2^? mod "<<n<<" = 1\n";
}
return 0;
}[/CODE]
the second one.
----------------解决方案--------------------------------------------------------
以下是引用nuciewth在2006-12-12 22:02:42的发言:

我的想法是把每一个数对应有多少个数字保存起来.并且有下面的递推式:


a[i]=a[i-1]+i的位数.i!=0
a[i]=0; i==0
与此同时做while(num>a[i])num-=a[i];一次循环可以出来.
则循环退出时,num必定在某个a[i]范围内.此时我只要将从1到i所有的数字求出来b[j](j从1开始保存),我就知道num对应的数字了.
是b[num];

不知道这样的想法是否正确...

那干吗不实现下自己的想法呢?
每个数对应的数字个数:
a[i]=a[i-1]+i
这个有点奇怪哦,
当i=1时,a[1]=1
i=2,a[2]=3了吧?还是我理解错了,请说详细点。难道要a[2]-a[1]才是?

饿,对的。下面就是num-=a[i]。
试下吧。


----------------解决方案--------------------------------------------------------
[CODE]
#include <stdio.h>
main()
{
long x;
int i,a;
scanf("%d",&x);

if(x<=45)
{
for(i=1;;i++)
if(i*(i+1)/2>=x) break;

x=x-i*(i-1)/2;

printf("%d",x);
}

if(x>45&&x<=9045)
{
for(i=10;;i++)
if(i*(i+1)/2+(i-9)*(i-8)/2>=x) break;

i=i-1;
x=x-i*(i+1)/2-(i-9)*(i-8)/2;

if(x>9)
{
x=x-9;
if(x%2)
{
x=x/2+9+1;
x=(x/10)%10;
printf("%d",x);
}
else
{
x=x/2+9;
x=x%10;
printf("%d",x);
}
}
else
printf("%d",x);
}
}
[/CODE]

这是前2位数的。

可以算哦。输入依然没改正。SORRY

我都只有死算了。。。T。T可悲咧!
----------------解决方案--------------------------------------------------------
1 2 3 4 ...9 10 11 12...
1 2 3 4 ...9 11 13 15...

实现过了,WA.
觉得想法应该没有错.
----------------解决方案--------------------------------------------------------

因为10要拆成2个数。

而你在每个数对应的位数计算时把10当成了1个数。所以就会这样了嘛。看来还是要死算。。。

我原本也以为你的这个办法能让我少算点东西呢。呵呵!


----------------解决方案--------------------------------------------------------
我的10是拆成两个数啊,要不然也不会是11了.
----------------解决方案--------------------------------------------------------
那哪不对了?我没看懂。

是不是输入与输出不符合呀?
----------------解决方案--------------------------------------------------------
具体是,把num缩小在某个a[i]范围之内   (if(num&gt;a[i]){num-=a[i];}),    然后把1--i中所有的数字顺序保存在b[]中,此时b[num]就是输出.
----------------解决方案--------------------------------------------------------
  相关解决方案