| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 5334 人关注过本帖
标题:【此帖作废】[非c高手进]帮忙编程解决这两道小学奥数题
只看楼主 加入收藏
fulanlinghun
Rank: 1
等 级:新手上路
帖 子:4
专家分:0
注 册:2008-7-5
收藏
得分:0 
第二题
变量和函数用得比楼主的多很多,但是速度很快
我也是刚学几天,有不对的地方大家纠正一下
#include<stdio.h>
void main()
{long int a,b,c,d,e,f,g,h,i,j,k,m,min=9999999;

for(a=2,d=5040;a<=d;a++)
{
if(5040%a==0)
{j=5040/a;
for(b=3;b<=d;b++)
{
if(j%b==0)
{k=j/b;
for(c=4;c<=d;c++)
{
if(k%c==0)
{m=k/c;
d=m;
if(a!=b&&b!=c&&c!=d&&a!=c&&a!=d&&b!=d)
{
e=a+b+c+d;
if(e<min)
{min=e;
f=a;
g=b;
h=c;
i=d;
}}}}}}}}
printf("min=%.ld\n",min);
printf("%d\n",f);
printf("%d\n",g);
printf("%d\n",h);
printf("%d\n",i);
getch();
}
2008-08-04 05:41
elan1986
Rank: 6Rank: 6
等 级:贵宾
威 望:18
帖 子:458
专家分:407
注 册:2007-12-17
收藏
得分:0 
楼上的方法不错
支持
2008-08-04 09:45
StarWing83
Rank: 8Rank: 8
来 自:仙女座大星云
等 级:贵宾
威 望:19
帖 子:3951
专家分:748
注 册:2007-11-16
收藏
得分:0 
广陵:你还是没学会英文命名,汗下……

专心编程………
飞燕算法初级群:3996098
我的Blog
2008-08-04 10:49
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
[bo][un]fulanlinghun[/un] 在 2008-8-4 05:41 的发言:[/bo]

第二题
变量和函数用得比楼主的多很多,但是速度很快
我也是刚学几天,有不对的地方大家纠正一下
#include
void main()
{long int a,b,c,d,e,f,g,h,i,j,k,m,min=9999999;

for(a=2,d=5040;a

给你的两个建议。
1. for(a=2,d=5040;a<=d;a++) 改成 for(a=2,d=5040;a*4<min;a++)
你自己算算效率提高多少。
2. 你的代码很难看。
2008-08-04 13:22
fish7fish7
Rank: 1
等 级:新手上路
威 望:1
帖 子:145
专家分:0
注 册:2008-7-31
收藏
得分:0 
非常感谢fulanlinghun,好人啊,难找啊^.^
你给了我一个新的思路,写了如下代码,好累啊,本希望能更普遍更强大,可是编译出错,运行出错;希望路过的高手帮忙,小抬贵手,帮忙改错,晚辈感激不尽
……
程序代码:
#include"stdio.h"
int *panduan(int a,int n)                   /*此函数用于判断a的因数*/
{
    int i,j=0,s[9999][9999],t=0;
    for(i=1;i<=a;i++)
        if(a%i==0) 
        {s[i-1][j]=i;
        j++;
        t++;
        if(t==n-1) s[i-1][j]=a/i;
        else panduan(a/i,n);
        }
    return s;                                /*返回各种情况的数组的起始地址*/
}


int *he(int (*p)[9999],int *t)                    /*此函数用于求a的因数的和*/
{
    int i,j,k=0,sum[9999]={0},*q=sum;
    for(i=0;i<9999;i++)
    {for(j=0;j<9999;j++)
            if(p[i][j]==0) break;
            else sum[i]+=p[i][j];
     if(sum[i]==0) break;
    }
    *t=i-1;
    return q;                                    /*返回和数组的起始地址*/
}


int fmin(int *p,int t,int *sum)                        /*此函数用于找到和的最小值*/
{
    int i,j=0,min;
    min=p[0];
    for(i=1;i<=t;i++)
        if(min>p[i]) {min=p[i];j=i;} 
    *sum=min;
    return j;                                        /*返回和最小的数组的下标*/
}


void main()
{
    int a,n,min,minp,(*p)[9999],*sum,t=0,i;
    printf("请输入被拆分的数:");
    scanf("%d",&a);
    printf("请输入想要拆成多少个数:");
    scanf("%d",&n);
    p=panduan(a,n);
    sum=he(p,&t);
    minp=fmin(sum,t,&min);
    printf("拆分的数如下:\n");
    for(i=0;i!=0;i++)
        printf("%d\t",p[minp][i]);
    puts("");
    printf("其和为%d\n",min);
}


[[it] 本帖最后由 fish7fish7 于 2008-8-4 13:48 编辑 [/it]]
2008-08-04 13:46
卧龙孔明
Rank: 9Rank: 9Rank: 9
等 级:贵宾
威 望:59
帖 子:3872
专家分:684
注 册:2006-10-13
收藏
得分:0 
楼主把帖子的名改了

看了楼主的几个帖子前缀,分别是
[C高手进],[编程论坛最强帖],[自认为是C天才的进]等。

可以看出楼主的学习态度不端正,或者是楼主刚刚进入论坛,没有看过提问的智慧这文章。

我不想再多说了,我是冒牌的.

My Blog: www.aiexp.info
虽然我的路是从这里开始的,但是这里不再是乐土.感谢曾经影响过,引导过,帮助过我的董凯,飞燕,leeco,starwing,Rockcarry,soft_wind等等等等.别了,BCCN.
2008-08-04 14:07
elan1986
Rank: 6Rank: 6
等 级:贵宾
威 望:18
帖 子:458
专家分:407
注 册:2007-12-17
收藏
得分:0 
我来说几句
其实第二道题要是用MATLAB来求解的话 是很简单的
可惜我的不太会使用那个强大的工具
factor(sym('5040'))
2008-08-04 14:30
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
不是打击你,25#的程序基本上不靠普,没法改。
不如我自己写

#include<stdio.h>
#include<string.h>
int fun(int m,int n)
{
    for(int i=m+1;i<=n;i++)
        if(n%i==0) return i;
    return 1;
}
int panduan(int a,int n,int * p)
{
    int sum,min=999999,copya=a;
    for(int i=1;i<=min/4;i++,a=copya)
    {
        if(a%i==0) p[0]=i,sum=i,a/=p[0];
        for(int j=1;j<n-1;j++)
        {
            p[j]=fun(p[j-1],a);
            sum+=p[j];
            a/=p[j];
        }
        p[n-1]=a;
        sum+=p[n-1];
        if(sum<min)
        {
            min = sum;
            memcpy(p+100,p,n*sizeof(int));
        }
    }
    memcpy(p,p+100,n*sizeof(int));
    return min;
}

void main()
{
    int a,n,min,p[200],i;
    printf("请输入被拆分的数:");
    scanf("%d",&a);
    printf("请输入想要拆成多少个数:");
    scanf("%d",&n);
    min=panduan(a,n,p);
    printf("拆分的数如下:\n");
    for(i=0;i<n;i++)
        printf("%d\t",p[i]);
    printf("其和为%d\n",min);
}
2008-08-04 14:32
woshiyun
Rank: 1
等 级:新手上路
威 望:2
帖 子:348
专家分:0
注 册:2008-6-16
收藏
得分:0 
不好意思。
for(int i=1;i<=min/4;i++,a=copya) 应该是
for(int i=1;i<=min/n;i++,a=copya)

#include<stdio.h>
#include<string.h>
int fun(int m,int n)
{
    for(int i=m+1;i<=n;i++)
        if(n%i==0) return i;
    return 1;
}
int panduan(int a,int n,int * p)     
{
    int sum,min=999999,copya=a;
    for(int i=1;i<=min/n;i++,a=copya)
    {
        if(a%i==0) p[0]=i,sum=i,a/=p[0];
        for(int j=1;j<n-1;j++)
        {
            p[j]=fun(p[j-1],a);
            sum+=p[j];
            a/=p[j];
        }
        p[n-1]=a;
        sum+=p[n-1];
        if(sum<min)
        {
            min = sum;
            memcpy(p+100,p,n*sizeof(int));
        }
    }
    memcpy(p,p+100,n*sizeof(int));
    return min;
}

void main()
{
    int a,n,min,p[200],i;
    printf("请输入被拆分的数:");
    scanf("%d",&a);
    printf("请输入想要拆成多少个数:");
    scanf("%d",&n);
    min=panduan(a,n,p);
    printf("拆分的数如下:\n");
    for(i=0;i<n;i++)
        printf("%d\t",p[i]);
    printf("其和为%d\n",min);
}
2008-08-04 14:39
fish7fish7
Rank: 1
等 级:新手上路
威 望:1
帖 子:145
专家分:0
注 册:2008-7-31
收藏
得分:0 
我怀疑26#的斑竹是不是来我这灌水来了,我学习态度端正与否,我自己心里有数,不必别人替我定义,谢谢,我想这样总比那些没事灌水的斑竹好些吧,行了,我不想多说,群众的眼睛是血亮的,好自为之,……
楼上的程序有很多错误,还有希望楼上以后写程序能加一些注释,否则很难看……
(以上若有言辞过激的地方还请见谅,谢谢……)

[[it] 本帖最后由 fish7fish7 于 2008-8-4 14:59 编辑 [/it]]
2008-08-04 14:55
快速回复:【此帖作废】[非c高手进]帮忙编程解决这两道小学奥数题
数据加载中...
 
   



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

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