第一题的题意还是不怎么懂
英语水平有限.....
能介绍清楚点吗?
就是有个有序的数字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.
----------------解决方案--------------------------------------------------------
我的想法是把每一个数对应有多少个数字保存起来.并且有下面的递推式:
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>a[i]){num-=a[i];}), 然后把1--i中所有的数字顺序保存在b[]中,此时b[num]就是输出.
----------------解决方案--------------------------------------------------------