标题:[讨论]第五期题目,大家做做.
只看楼主
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
得分:0 
在a[i+1]的范围里面吧。


人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2006-12-14 16:02
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
得分:0 

不对不对。的确就是存的时候不对。

a[i]=a[i-1]+i

这个的时候就不对了。10是当成1个数用的。不信斑竹你自己数一下。


人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2006-12-14 16:31
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 

#include <stdio.h>
#include <math.h>
#define N 5

const unsigned long total_length[N] = { 0, 45, 9045, 1395495, 189414495};
const unsigned long first[N + 1] = {0, 1, 11, 192, 2893, 38894};
const unsigned long last[N] = {0, 9, 189, 2889, 38889};

int main()
{
unsigned i, j, n;
unsigned long index;

scanf("%ld", &n);
for (i = 0; i < n; i++)
{
unsigned len, t, k;

scanf("%ld", &index);
for (j = 1; j < N; j++)
if (index <= total_length[j])
break;
len = j;
index -= total_length[len - 1];
for (j = 1; ; j++)
if ((first[len] * j + j * (j - 1) * len / 2) >= index)
break;
index = index - first[len] * (j - 1) - (j - 1) * (j - 2) * len / 2;
for (j = 1; j < N; j++)
if (index <= last[j])
break;
if (j == 1)
printf("%d\n", index);
else
{
index -= last[j - 1];
t = (index - 1) / j + (int) pow(10, j - 1);
k = t / (int) pow(10, j - 1 - (index-1) % j) % 10;
printf("%d\n", k);
}
}
return 0;
}


2006-12-14 16:57
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
得分:0 
饿。斑竹对了。捷足先登了呀。。。呼。。。这个很对。呵呵。

人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2006-12-14 17:04
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
以下是引用走刀口→超在2006-12-14 16:31:11的发言:

不对不对。的确就是存的时候不对。

a[i]=a[i-1]+i的位数

这个的时候就不对了。10是当成1个数用的。不信斑竹你自己数一下。


倚天照海花无数,流水高山心自知。
2006-12-14 20:31
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
我不是郭靖斑竹
解释一下你的思路.
我也有这样差不多的程序,不过没看懂.

倚天照海花无数,流水高山心自知。
2006-12-14 20:33
我不是郭靖
Rank: 3Rank: 3
等 级:新手上路
威 望:6
帖 子:494
专家分:6
注 册:2006-10-4
得分:0 

那我加一点注释,希望有助理解

#include <stdio.h>
#include <math.h>
#define N 5

const unsigned long total_length[N] = { 0, 45, 9045, 1395495, 189414495};/*位数分别为1,2,3,4时的序列总长度*/
const unsigned long first[N + 1] = {0, 1, 11, 192, 2893, 38894};/*位数分别为1,2,3,4,5时第一个序列的长度*/
const unsigned long last[N] = {0, 9, 189, 2889, 38889};/*位数分别为1,2,3,4时最后一个序列的长度*/

int main()
{
unsigned i, j, n;
unsigned long index;

scanf("%ld", &n);
for (i = 0; i < n; i++)
{
unsigned len, t, k;

scanf("%ld", &index);
for (j = 1; j < N; j++) /*判断index所处序列的位数,并存如len*/
if (index <= total_length[j])
break;
len = j;
index -= total_length[len - 1];
for (j = 1; ; j++) /*判断在位数为len的序列中所处的位置*/
if ((first[len] * j + j * (j - 1) * len / 2) >= index) /*等差序列求和公式a1*n+n*(n-1)*k/2 */
break;
index = index - first[len] * (j - 1) - (j - 1) * (j - 2) * len / 2;/*得到小序列中的位置*/
for (j = 1; j < N; j++) /*判断所求数字在几位数区域*/
if (index <= last[j])
break;
if (j == 1)
printf("%d\n", index);
else
{
index -= last[j - 1];
t = (index - 1) / j + (int) pow(10, j - 1);/*t为所求数字所在具体的数中*/
k = t / (int) pow(10, j - 1 - (index-1) % j) % 10;
printf("%d\n", k);
}
}
return 0;
}


2006-12-14 21:15
走刀口→超
Rank: 6Rank: 6
等 级:贵宾
威 望:20
帖 子:5018
专家分:0
注 册:2006-3-14
得分:0 
我不是郭靖斑竹解释过了看懂了么?

我不是郭靖斑竹写的程序真规范。。。我达不到饿。好好学习哈。

人在江湖【走】,怎能不挨【刀】;为了能活【口】,唯有把己【超】!come on...
2006-12-15 10:10
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 
贴出第二个的代码,具体做法和我不是郭靖斑竹的差不多.
#include<iostream>
using namespace std;
int main()
{
long long a[5]={0,45,9045,1395495,189414495};
long long b[6]={0,1,11,192,2893,38894};
long long c[6]={0,1,10,100,1000,10000};
long long n,i,t,j,s,f;
for(cin>>n;n>0;n--)
{
cin>>i;
for(j=1;i>a[j];++j);
i-=a[j-1];
s=b[j],f=c[j];
for(;i>s;++f)
s+=b[j]+(f-c[j]+1)*j;
t=s-i;
for(;t>0;--f,t-=j)
if(f<c[j])j--;
if(t!=0)
{
f+=1;
if(f>c[j]*10-1)j++;
t+=j;
for(;t!=0;--t,f/=10);
}
cout<<f%10<<endl;
}
return 0;
}

倚天照海花无数,流水高山心自知。
2006-12-16 20:46
nuciewth
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:我爱龙龙
等 级:贵宾
威 望:104
帖 子:9786
专家分:208
注 册:2006-5-23
得分:0 

第二个
#include<iostream.h>
#include<stdio.h>

int main()
{
int i;
long s,n;

while(EOF!=(scanf("%ld",&n))&&n!=0)
{
if(n%2==0||n<2)//是偶数或小于2就直接输出找不到.
{
printf("2^? mod %ld = 1\n",n);
}
else
{
s=1;i=0;
while(1)//这里主要是找规律,想了很久的,不过以前做的,代几个数看看吧.
{
if(s<n)
{
s=s*2;
i++;
}
else
{
s=s-n;
}
if(s==1)
break;
}
printf("2^%d mod %ld = 1\n",i,n);
}
}
return(0);
}


倚天照海花无数,流水高山心自知。
2006-12-16 20:49



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-108628-1-1.html




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

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