|
马上注册,结交更多好友,享用更多功能^_^
您需要 登录 才可以下载或查看,没有账号?立即注册
x
本帖最后由 耀耀切克闹 于 2022-4-21 00:42 编辑
- #include<stdio.h>
- int pow(int a,int b)
- {
- int i=1;
- if(b==0) a=1;
- else for(i=1;i<=b;i++)
- a*=a;
- return(a);
- }
- int main()
- {
- int m,n;
- while(scanf("%d %d",&n,&m)!=EOF)
- {
- int x=0,y=0,i=0,j=0,a[n];
- for(x=0;((pow(2,x))*(pow(3,y)))<n;x++)
- for(y=0;((pow(2,x))*(pow(3,y)))<n;y++)
- a[i++]=(pow(2,x))*(pow(3,y));
- printf("%d",i);
- }
- return 0;
- }
复制代码
设 x,y 为非负整数,试计算集合 M={(2^x)*(3^y),x>=0,y>=0} 的元素不大于指定整数 n 的个数,并求这些元素从小到大排序的第 m 项。
输入描述
多组输入,每组一行,输入 n 和 m,n 和 m 之间用一个空格分开
输出描述
对于每组输入,输出数列中不大于 n 的项数以及第 m 项的值,这两个数占两行。
样例输入:
10000000 100
样例输出:
190
93312
这道题我运行出来的结果很奇怪,但是我又不知道怎么改,查了网上的答案,是说要反过来思考,但是n很大的时候就运行不出来结果
本帖最后由 wp231957 于 2022-4-21 09:14 编辑
- #include <stdio.h>
- long long int mypow(int a,int b)
- {
- long long int t=1;
- if(b==0)
- return 1;
- else
- for(int i=1;i<=b;i++) t*=a;
- return t;
- }
- int main()
- {
- long long int m=10000000;
- int n=100;
- long long int result[10000]={0};
- int count=0;
- for(int i=0;1;i++)
- {
- for(int j=0;1;j++)
- {
- long long tmp=mypow(2,i)*mypow(3,j);
- if (tmp<=m)
- {
- result[count++]=tmp;
- }
- else
- {
- break;
- }
- }
- if (mypow(2,i)>m)
- {
- break;
- }
- }
- for (int i=0;i<count;i++)
- {
- for(int j=i+1;j<count;j++)
- {
- if (result[i]>result[j])
- {
- int s=result[i];
- result[i]=result[j];
- result[j]=s;
- }
- }
- }
- printf("共有%d个数据满足要求,其中排序后第100个数据是 %lld\n",count,result[99]);
- return 0;
- }
- /*
- PS C:\Users\Administrator> ./ct
- 共有190个数据满足要求,其中排序后第100个数据是 93312
- */
复制代码
|
|