| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 6095 人关注过本帖, 1 人收藏
标题:C语言寻找素数和最佳方案寻找两道题
只看楼主 加入收藏
Kaiaiaiai
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-11-6
收藏
得分:0 
回复 10楼 九转星河
应该可以

我只想好好学习C语言
2016-11-06 15:19
哈斯佛道
Rank: 2
等 级:论坛游民
帖 子:23
专家分:81
注 册:2016-8-15
收藏
得分:5 
第一题算法思路:1.a小于2,输出最近素数为2.下面讨论a>=2的情况。
                2.a本身是素数,输出a(距离为0)
                3.a不是素数,下面分奇偶讨论
                4.a为奇数:判断a+2n和a-2n是否为素数
                5.a为偶数: 判断a+(2n+1)和a-(2n+1)是否为素数
                建议将判断素数这一步骤封装成函数。
代码如下:(可能不够简洁,水平有限,用notepad++写的时候对齐的挺好,贴过来变这样头疼)
#include<stdio.h>
#include<math.h>
int pri_num(int x);
int main()
{
 int a;
 printf("请输入一个整数:");
 scanf("%d",&a);   
 if(a<2)printf("距离此数最近的素数是2");//a为负整数
 else//a为正整数
 {
   if(pri_num(a)) printf("距离此数最近的素数是%d",a);//a本身是素数
   else//a不是素数
   {   
     int n=0,b,c=0;
     if(a%2==0)//a是偶数
     {                    
      while(1)//寻找距离此数最近的素数
      {
        b=2*n+1;
        if(pri_num(a+b))//a+b为素数
        {
            c=1;
            if(pri_num(a-b))printf("距离此数最近的素数有两个:%d %d\n",a+b,a-b);
            else printf("距离此数最近的素数是%d\n",a+b);        
         }
         else if (pri_num(a-b))//a-b为素数
         {
            c=1;
            printf("距离此数最近的素数是%d\n",a-b);
          }
         if(c==1)break;
         n++;                 
     }               
    }
     else //a是奇数
     {                    
        while(1)
        {
            b=2*n;
            if(pri_num(a+b))//a+b为素数
       {
            c=1;
            if(pri_num(a-b))printf("距离此数最近的素数有两个:%d %d\n",a+b,a-b);
            else printf("距离此数最近的素数是%d\n",a+b);
                        
        }
        else if (pri_num(a-b))//a-b为素数
        {
            c=1;
            printf("距离此数最近的素数是%d\n",a-b);
         }
         if(c==1)break;
         n++;
      }
     }
    }   
  }
    return 0;
}
int pri_num (int x)//素数判断函数,是返回1;不是返回0
{
    int i;
    for(i=2;i<=(int)sqrt(x);i++)
    {
        if(x%i==0)break;//不是素数立即跳出循环
    }
    if(i>(int)sqrt(x))return 1;//是素数返回1
    return 0;    //不是返回0
}

[此贴子已经被作者于2016-11-6 16:50编辑过]

2016-11-06 15:34
Kaiaiaiai
Rank: 1
等 级:新手上路
帖 子:9
专家分:0
注 册:2016-11-6
收藏
得分:0 
回复 10楼 九转星河
可以取!

我只想好好学习C语言
2016-11-06 15:44
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 13楼 Kaiaiaiai
那我就继续忙了,不过现在没空,今天可能不回了

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-06 15:50
九转星河
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:长长久久
等 级:贵宾
威 望:52
帖 子:5023
专家分:14003
注 册:2016-10-22
收藏
得分:0 
回复 12楼 哈斯佛道
你这个代码还有点小问题:
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

[code]/*~个性签名:bug是什么意思?bug是看上去没有可能的东西实际上是有可能做到的 就是这样~2018-08-08更~*/[/code]
2016-11-06 16:45
哈斯佛道
Rank: 2
等 级:论坛游民
帖 子:23
专家分:81
注 册:2016-8-15
收藏
得分:0 
回复 15楼 九转星河
嗯,第一个判断改成a<2就行
2016-11-06 16:48
哈斯佛道
Rank: 2
等 级:论坛游民
帖 子:23
专家分:81
注 册:2016-8-15
收藏
得分:5 
第二题试着做了下,感觉是个线性规划问题。
#include<stdio.h>
int main()
{
    float m;
    int pis,a,b;
    printf("输入原料重量,单位为kg:");
    scanf("%f\n",&m);
    pis=(int)(55*m/0.5+0.5);
    printf("可以制作%d块巧克力",pis);
    a=pis/24;
    b=(pis-24*a)/11;
    printf("大盒%d个,小盒%d个",a,b);
    return 0;
}
2016-11-07 11:16
书生牛犊
Rank: 14Rank: 14Rank: 14Rank: 14
来 自:星夜征程
等 级:贵宾
威 望:10
帖 子:1101
专家分:5265
注 册:2015-10-27
收藏
得分:0 
回复 17楼 哈斯佛道
第二题是要尽可能令剩余的巧克力更少。所以分配盒子的时候不能线性规划。比如33,48等,很多时候是不能直接“按照优先大盒子,剩下的装到小盒子里的方法”

“加妠”的思路就蛮可取的。

φ(゜▽゜*)♪
2016-11-07 16:30
哈斯佛道
Rank: 2
等 级:论坛游民
帖 子:23
专家分:81
注 册:2016-8-15
收藏
得分:0 
回复 18楼 书生牛犊
哦,还没想明白,我在思考一下
2016-11-07 19:06
哈斯佛道
Rank: 2
等 级:论坛游民
帖 子:23
专家分:81
注 册:2016-8-15
收藏
得分:0 
回复 18楼 书生牛犊
嗯,是这样,一开始完全用线性规划那一套做了,没考虑到11的倍数。加奈算法中先用小盒子装,再根据小盒和大盒子换算关系将小盒换成大盒其实最终目的还是用大盒尽可能地装,不过厉害的的地方是11的倍数不用考虑了。学到了!
2016-11-07 19:40
快速回复:C语言寻找素数和最佳方案寻找两道题
数据加载中...
 
   



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

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