鱼C论坛

 找回密码
 立即注册
查看: 3472|回复: 7

[已解决]各位大佬帮忙看道幂积序列的题目

[复制链接]
发表于 2022-4-20 22:36:05 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 耀耀切克闹 于 2022-4-21 00:42 编辑
  1. #include<stdio.h>
  2. int pow(int a,int b)
  3. {
  4.         int i=1;
  5.         if(b==0) a=1;
  6.         else for(i=1;i<=b;i++)
  7.         a*=a;
  8.         return(a);
  9. }
  10. int main()
  11. {
  12.         int m,n;
  13.         while(scanf("%d %d",&n,&m)!=EOF)
  14.         {
  15.                 int x=0,y=0,i=0,j=0,a[n];
  16.                 for(x=0;((pow(2,x))*(pow(3,y)))<n;x++)
  17.                    for(y=0;((pow(2,x))*(pow(3,y)))<n;y++)
  18.                           a[i++]=(pow(2,x))*(pow(3,y));
  19.                 printf("%d",i);
  20.         }
  21.         return 0;
  22. }
复制代码

设 x,y 为非负整数,试计算集合 M={(2^x)*(3^y),x>=0,y>=0} 的元素不大于指定整数 n 的个数,并求这些元素从小到大排序的第 m 项。

输入描述
多组输入,每组一行,输入 n 和 m,n 和 m 之间用一个空格分开

输出描述
对于每组输入,输出数列中不大于 n 的项数以及第 m 项的值,这两个数占两行。

样例输入:
10000000 100

样例输出:
190

93312

这道题我运行出来的结果很奇怪,但是我又不知道怎么改,查了网上的答案,是说要反过来思考,但是n很大的时候就运行不出来结果
最佳答案
2022-4-21 09:13:28
本帖最后由 wp231957 于 2022-4-21 09:14 编辑
  1. #include <stdio.h>

  2. long long int mypow(int a,int b)
  3. {
  4.     long long int t=1;
  5.     if(b==0)
  6.         return 1;
  7.     else
  8.         for(int i=1;i<=b;i++) t*=a;
  9.     return t;
  10. }

  11. int main()
  12. {
  13.     long long int m=10000000;
  14.     int n=100;
  15.     long long int result[10000]={0};
  16.     int count=0;
  17.     for(int i=0;1;i++)
  18.     {
  19.         for(int j=0;1;j++)
  20.         {
  21.             long long tmp=mypow(2,i)*mypow(3,j);
  22.             if (tmp<=m)
  23.             {
  24.                 result[count++]=tmp;
  25.             }
  26.             else
  27.             {
  28.                 break;
  29.             }
  30.         }
  31.         if (mypow(2,i)>m)
  32.         {
  33.             break;
  34.         }
  35.     }
  36.     for (int i=0;i<count;i++)
  37.     {
  38.         for(int j=i+1;j<count;j++)
  39.         {
  40.             if (result[i]>result[j])
  41.             {
  42.                 int s=result[i];
  43.                 result[i]=result[j];
  44.                 result[j]=s;
  45.             }
  46.         }
  47.     }
  48.     printf("共有%d个数据满足要求,其中排序后第100个数据是 %lld\n",count,result[99]);
  49.     return 0;
  50. }

  51. /*
  52. PS C:\Users\Administrator> ./ct
  53. 共有190个数据满足要求,其中排序后第100个数据是 93312
  54. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2022-4-21 09:13:28 | 显示全部楼层    本楼为最佳答案   
本帖最后由 wp231957 于 2022-4-21 09:14 编辑
  1. #include <stdio.h>

  2. long long int mypow(int a,int b)
  3. {
  4.     long long int t=1;
  5.     if(b==0)
  6.         return 1;
  7.     else
  8.         for(int i=1;i<=b;i++) t*=a;
  9.     return t;
  10. }

  11. int main()
  12. {
  13.     long long int m=10000000;
  14.     int n=100;
  15.     long long int result[10000]={0};
  16.     int count=0;
  17.     for(int i=0;1;i++)
  18.     {
  19.         for(int j=0;1;j++)
  20.         {
  21.             long long tmp=mypow(2,i)*mypow(3,j);
  22.             if (tmp<=m)
  23.             {
  24.                 result[count++]=tmp;
  25.             }
  26.             else
  27.             {
  28.                 break;
  29.             }
  30.         }
  31.         if (mypow(2,i)>m)
  32.         {
  33.             break;
  34.         }
  35.     }
  36.     for (int i=0;i<count;i++)
  37.     {
  38.         for(int j=i+1;j<count;j++)
  39.         {
  40.             if (result[i]>result[j])
  41.             {
  42.                 int s=result[i];
  43.                 result[i]=result[j];
  44.                 result[j]=s;
  45.             }
  46.         }
  47.     }
  48.     printf("共有%d个数据满足要求,其中排序后第100个数据是 %lld\n",count,result[99]);
  49.     return 0;
  50. }

  51. /*
  52. PS C:\Users\Administrator> ./ct
  53. 共有190个数据满足要求,其中排序后第100个数据是 93312
  54. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-21 09:21:35 | 显示全部楼层
本帖最后由 wp231957 于 2022-4-21 09:24 编辑

代码可以简化一下,但是我觉得排序好像绕不过去
  1. #include <stdio.h>

  2. long long int mypow(int a,int b)
  3. {
  4.     long long int t=1;
  5.     if(b==0)  return 1;
  6.     for(int i=1;i<=b;i++) t*=a;
  7.     return t;
  8. }

  9. int main()
  10. {
  11.     long long int m=10000000;
  12.     int n=100;
  13.     long long int result[10000]={0};
  14.     int count=0;
  15.     for(int i=0;mypow(2,i)<=m;i++)
  16.     {
  17.         for(int j=0;mypow(2,i)*mypow(3,j)<=m;j++)
  18.         {
  19.             result[count++]=mypow(2,i)*mypow(3,j);
  20.         }
  21.     }
  22.     for (int i=0;i<count;i++)
  23.     {
  24.         for(int j=i+1;j<count;j++)
  25.         {
  26.             if (result[i]>result[j])
  27.             {
  28.                 int s=result[i];
  29.                 result[i]=result[j];
  30.                 result[j]=s;
  31.             }
  32.         }
  33.     }
  34.     printf("共有%d个数据满足要求,其中排序后第100个数据是 %lld\n",count,result[99]);
  35.     return 0;
  36. }

  37. /*
  38. PS C:\Users\Administrator> ./ct
  39. 共有190个数据满足要求,其中排序后第100个数据是 93312
  40. */
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-21 09:43:23 | 显示全部楼层
  1. #include<stdio.h>
  2. int pow(int a,int b)
  3. {
  4.         int i=1,s=1;
  5.         if(b>0)
  6.                         for(i=1;i<=b;i++)s*=a;
  7.         return(s);
  8. }
  9. int main()
  10. {
  11.         int m,n;
  12.                
  13.        scanf("%d %d",&n,&m);
  14.        int x=0,y=2,i=0,j=0,s=1,flag=1;
  15.            for(x=0;flag;x++)
  16.            {
  17.                    flag=0;
  18.                    for(y=0;(s=pow(2,x)*pow(3,y))<n;y++)
  19.                    {
  20.                            flag=1;
  21.                            i++;
  22.                            if(i==m) printf("%d\n",s);
  23.                    }
  24.            }
  25.        printf("%d",i);
  26.        
  27.                
  28.         return 0;
  29. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-21 09:46:33 From FishC Mobile | 显示全部楼层
jhq999 发表于 2022-4-21 09:43

排序是咋绕过去的
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2022-4-21 09:49:31 | 显示全部楼层
wp231957 发表于 2022-4-21 09:46
排序是咋绕过去的

嗷嗷我想先把小于n的元素个数写出来的,但是结果不对嘛,排序还没写
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-21 10:18:06 From FishC Mobile | 显示全部楼层
  1. #include <stdio.h>
  2. #include <math.h>
  3. #include <stdlib.h>

  4. int f(int x, int y){
  5.         return pow(2, x) * pow(3, y);
  6. }

  7. int compare(const void *a, const void *b){
  8.    return *(int*)a - *(int*)b;
  9. }

  10. int main(){
  11.         int
  12.                 n, m,
  13.                 count,
  14.                 a, b,
  15.                 N;
  16.        
  17.         scanf("%d%d", &n, &m);
  18.        
  19.         a = log2(n) + 1;
  20.         b = log2(n) / log2(3) + 1;
  21.         N = a*b;
  22.        
  23.         int arr[N];
  24.        
  25.         for(int i = 0; i < N; i++)
  26.         arr[i] = n+1;

  27.         for(int x = 0, i = 0; x < a; x++){
  28.                 for(int y = 0; y < b; y++){
  29.                         if(f(x, y) < n && f(x, y) > 0){
  30.                                 arr[i++] = f(x, y);
  31.                         }
  32.                 }
  33.         }
  34.        
  35.         qsort(arr, N, sizeof(int), compare);
  36.        
  37.         for(int i = 0; arr[i] < n; i++){
  38.                 count = i + 1;
  39.         }
  40.        
  41.         printf("%d\n\n%d", count, arr[m - 1]);
  42.         return 0;
  43. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2022-4-21 10:19:32 | 显示全部楼层
本帖最后由 jhq999 于 2022-4-21 10:23 编辑
wp231957 发表于 2022-4-21 09:46
排序是咋绕过去的


没想排序,只不过想测试下i==m时的值是否正确,估计是样例不具有普遍性
前面出来了,排序就简单了

小甲鱼最新课程 -> https://ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2025-7-12 17:55

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表