鱼C论坛

 找回密码
 立即注册
查看: 2758|回复: 15

算法优化问题

[复制链接]
发表于 2015-11-21 14:39:54 | 显示全部楼层 |阅读模式
15鱼币
本帖最后由 独一无② 于 2015-11-21 16:56 编辑

问题一:
输入钱币,输出兑换成 3分,2分, 1分 面值的人民币方法有几种。我发现用循环做,速度会很慢很慢。
样例输入:12553   输出:13137761
  1. # include <stdio.h>
  2. int main()
  3. {
  4.      int a,j,k,i,sum,num=0;
  5.      scanf("%d",&a);
  6.      for(j=1;j<=a;j++)
  7.      {
  8.         for(k=1;k<=a/2;k++)
  9.         {
  10.           for(i=1;i<=a/3;i++)
  11.           {
  12.               sum=i*3+k*2+j;
  13.               if(sum == a)
  14.                 num++;
  15.           }
  16.         }
  17.      }
  18.         printf("%d\n",num);
  19.         return 0;
  20. }
复制代码



问题二:
输入 n,求n的n次方的结果最右边那位数。
如 输入5
5*5*5*5*5=3125
输出结果 应为 5;
  1. # include <stdio.h>
  2. # include <math.h>
  3. int main()
  4. {
  5.    int a,b;
  6.    long c,d;
  7.    scanf("%d",&a);
  8.    for(b=1;b<=a;b++)
  9.    {
  10.       scanf("%ld",&c);
  11.       d=pow(c,c);
  12.       d=d%10;
  13.       printf("%ld\n",d);
  14.    }
  15. }
复制代码




上面的那二个问题,但输入数很大时,我写的代码都不可行,运行太慢了,求优化算法的方法。

最佳答案

查看完整内容

第一题: # include int main(){ int i,j,k,n,ans=0; scanf("%d",&n); int boun1=n/3,boun2=n/2; for(i=0;i
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-21 14:39:55 | 显示全部楼层
第一题:
# include <stdio.h>
int main(){
       
        int i,j,k,n,ans=0;
        scanf("%d",&n);
        int boun1=n/3,boun2=n/2;
        for(i=0;i<=boun1;++i){
                for(int j=0;j<=boun2;++j){
                        if(i*3+j*2<=n)
                        ++ans;
                }
        }
        printf("%d\n",ans);
        return 0;
}

第二题:
# include <stdio.h>
typedef long long int ll;
int main(){
        ll n;
        int last,i;
        scanf("%lld",&n);
        last=n%10;
        if(last<2||last==5||last==6||last==9){
                ;
        }else if(last==2||last==8){
                if(!(n%4))
                last=6;
                else
                last=4;
        }else if(last==4){
                last=6;
        }else if(last==3){
                i=n%4;
                switch(i){
                case 0: last=1;break;
                case 1: last=3;break;
                case 2: last=9;break;
                case 3: last=7;break;               
                default:break;               
                }
               
        }else if(last==7){
                i=n%4;
                switch(i){
                case 0: last=1;break;
                case 1: last=7;break;
                case 2: last=9;break;
                case 3: last=3;break;               
                default:break;               
                }
        }
        printf("%d\n",last);
       
}
应该还有更好的算法,这块应该算数论的内容吧:smile
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-21 16:18:47 | 显示全部楼层
怎么没有人啊!:cry求帮助!!!
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-21 16:50:55 | 显示全部楼层
第一个问题没看明白问题 和想要的结果,请详细一点,第二个问题输入 n,求n的n次方的结果最右边那位数,这个n 是一个数吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-21 16:53:35 | 显示全部楼层
y290176346 发表于 2015-11-21 16:50
第一个问题没看明白问题 和想要的结果,请详细一点,第二个问题输入 n,求n的n次方的结果最右边那位数,这个 ...

将输入的数转换为1分,2分,3分钱币 的方法有几种。下面那题 n就是输入的数,如例题的5.
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-21 16:58:10 | 显示全部楼层
我理解的你第二个问题 是 比如说32 就是32乘以自己的32次方,如果是这样的话我给你个提示,比如说各位是1的 和各位是1的两个数无论乘以多上次 结果个位都是1,个位是6的和各位是6的两个数无论乘以多少次都是6  个位是9 的和各位是9的两个数无论乘以多少次 各位要么是 1 要么是9,你可以根据这个思路找找规律来接话算法
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-21 17:08:33 | 显示全部楼层
y290176346 发表于 2015-11-21 16:58
我理解的你第二个问题 是 比如说32 就是32乘以自己的32次方,如果是这样的话我给你个提示,比如说各位是1的 ...

好的,谢谢。第一个问题,比如把5分钱,转换成 3分,2分, 1分的转换方法有几种。只有(3+1+1),(1+ 1+1+1+1),(3+2),(2+2+1),(1+1+1+2),5种。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-21 19:06:57 | 显示全部楼层
第二个问题:
  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         long n, i;
  5.         int x = 1;

  6.         printf("请输入一个正整数: ");
  7.         scanf("%ld", &n);

  8.         for (i = 0; i < n; i++)
  9.         {
  10.                 x = (x * n) % 10;
  11.         }

  12.         printf("结果为: %d\n", x);

  13.         return 0;
  14. }
复制代码


思路是把n连续乘n次,就是n的n次方,每一次相乘都只取出各位数然后再继续相乘,最后只保留个位上的数字就可以了。
我也是初学,不知到这样的算法可不可以。还有数太大了不知道怎么验证结果的正确性。
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-21 19:28:53 | 显示全部楼层

算法是对的,但是数据大的时候,输出时间结果还是太慢了。还有更好的优化算法吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-21 19:43:40 | 显示全部楼层
独一无② 发表于 2015-11-21 19:28
算法是对的,但是数据大的时候,输出时间结果还是太慢了。还有更好的优化算法吗?

这个。。。具体要多大的数呢?是不是都已经超过4个字节的范围了?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-21 20:02:32 | 显示全部楼层

\

本帖最后由 y290176346 于 2015-11-21 20:05 编辑

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

使用道具 举报

发表于 2015-11-21 20:24:54 | 显示全部楼层
独一无② 发表于 2015-11-21 19:28
算法是对的,但是数据大的时候,输出时间结果还是太慢了。还有更好的优化算法吗?

那就只想到找规律了,感觉有点作弊。。。

  1. #include <stdio.h>

  2. int main(void)
  3. {
  4.         unsigned long n;
  5.         int m;

  6.         printf("请输入一个正整数: ");
  7.         scanf("%ld", &n);

  8.         m = n % 10;
  9.        
  10.         switch (m)
  11.         {
  12.         case 0:
  13.         case 1:
  14.         case 5:
  15.         case 6:
  16.                 printf("结果为: %d\n", m);
  17.                 break;
  18.         case 8:
  19.         case 2:
  20.                 if (n % 4 == 2)
  21.                         printf("结果为: 4\n");
  22.                 else
  23.                         printf("结果为: 6\n");
  24.                 break;
  25.         case 3:
  26.                 if (n % 4 == 1)
  27.                         printf("结果为: 3\n");
  28.                 else
  29.                         printf("结果为: 7\n");
  30.                 break;
  31.         case 7:
  32.                 if (n % 4 == 1)
  33.                         printf("结果为: 7\n");
  34.                 else
  35.                         printf("结果为: 3\n");
  36.                 break;
  37.         case 4:
  38.                 printf("结果为: 6\n");
  39.                 break;
  40.         case 9:
  41.                 printf("结果为: 9\n");
  42.                 break;
  43.         }


  44.         return 0;
  45. }
复制代码
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-11-21 20:40:28 | 显示全部楼层
Alan_Ciao 发表于 2015-11-21 20:24
那就只想到找规律了,感觉有点作弊。。。

虽然有点作弊,但是也是一种解决方法。我连规律都找不出,谢谢~
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-11-22 02:05:43 From FishC Mobile | 显示全部楼层
用寄存器变量
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

发表于 2015-12-1 13:02:36 | 显示全部楼层
过来看看一起学习一下
:smile:smile:smile
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

 楼主| 发表于 2015-12-2 12:58:40 | 显示全部楼层
春在溪头荠菜花 发表于 2015-11-21 14:39
第一题:
# include
int main(){

算法一为什么 是boun1 是外循环,不是boun2 大一点,所以boun2 是外循环吗?
小甲鱼最新课程 -> https://ilovefishc.com
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2025-6-21 11:43

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

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