| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1447 人关注过本帖
标题:c语言数学题
只看楼主 加入收藏
leetom
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2009-6-16
结帖率:100%
收藏
已结贴  问题点数:20 回复次数:9 
c语言数学题
    某人购买的体育彩票猜中了4个号码,这4个号码按照从大到小的顺序组成一个数字可被11整除,将其颠倒过来也可被11整除,编写函数求符合这样条件的4个号码。可被11整除颠倒过来也可被11整除的正整数例如341,它可被11整除,颠倒过来143也可被11整除。体育彩票采用整数1、2、3、……、36表示36种体育运动。
这个要怎么做??难道要4曾循环挨个试?
求高手解答~
搜索更多相关主题的帖子: c语言 数学题 
2009-08-27 18:23
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:9 
回复 楼主 leetom
能被11整除的数的特点是:奇位上数的和 与 偶位上数的和 的差 是11的倍数(0也行)。
比如你说的341,(一般是从右数)奇位上的数是 1 和 3 ,和是4。偶位上是4。它们的差是4-4=0。因此它是341是11的倍数。
如果有这规律,那么凡是11倍数的,好像倒过来也一定还是11的倍数。
你确实是是4位数了,那么就应该不难编了。但我有点不是很明白,你说那数是1到36是什么意思?难道是说这四个数可以是类似 33,34,35,36 这样的?
那它就是个8位数了,这样的话就稍微困难了一点。但也可以用上面说的那个思路。另外这四个数可以重吗?比如 1,1,1,1 这样。
2009-08-27 22:24
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 楼主 leetom
能被11整除的数的特点是:奇位上数的和 与 偶位上数的和 的差 是11的倍数(0也行)。
比如你说的341,(一般是从右数)奇位上的数是 1 和 3 ,和是4。偶位上是4。它们的差是4-4=0。因此它是341是11的倍数。
如果有这规律,那么凡是11倍数的,好像倒过来也一定还是11的倍数。
你确实是是4位数了,那么就应该不难编了。但我有点不是很明白,你说那数是1到36是什么意思?难道是说这四个数可以是类似 33,34,35,36 这样的?
那它就是个8位数了,这样的话就稍微困难了一点。但也可以用上面说的那个思路。另外这四个数可以重吗?比如 1,1,1,1 这样。
2009-08-27 22:24
leeco
Rank: 4
等 级:贵宾
威 望:10
帖 子:1029
专家分:177
注 册:2007-5-10
收藏
得分:7 
能被11整除的数的特点是,把这个数从低位开始拆成两位两位的,然后加起来,如果这个数仍然是2位数以上,则继续拆成两位两位再加起来,最终得到一个一位数或者两位数,如果是11的倍数,那原数就是11的倍数,否则就不是。一位数里没有11的倍数,而两位数是11倍数的特征很明显,就是两位上的数一样,所以很好判断。
比如你说的341,拆成3+41 =44,那么就是11的倍数。
2009-08-27 22:43
liangonejzh
Rank: 2
等 级:论坛游民
帖 子:20
专家分:18
注 册:2009-7-30
收藏
得分:4 
回复 2楼 pangding
同意,看题意33,34,35,36组合是可以的,但一个数出现两遍应该是不行的
2009-08-27 22:49
leetom
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2009-6-16
收藏
得分:0 
以下是引用pangding在2009-8-27 22:24的发言:
能被11整除的数的特点是:奇位上数的和 与 偶位上数的和 的差 是11的倍数(0也行)。
比如你说的341,(一般是从右数)奇位上的数是 1 和 3 ,和是4。偶位上是4。它们的差是4-4=0。因此它是341是11的倍数。
如果有这规律 ...
版主的方法好~但是我感觉这里不好用。。。。还是穷举吧~
程序代码:
#include "stdio.h"
#include <math.h>
#include <stdlib.h>
main()
{
    int n[4],i,digit[8],digit_all,digit_left;
    int mul[4];
    long num,num_turn;
    for (n[0]=1;n[0]<=36;n[0]++)
        for (n[1]=1;n[1]<n[0];n[1]++)
            for (n[2]=1;n[2]<n[1];n[2]++)
                for (n[3]=1;n[3]<n[2];n[3]++)
                    {num=num_turn=0;
                     for (i=0;i<4;i++)
                        {if (n[i]>=10) mul[i]=2;
                         else mul[i]=1;
                        }
                     num=n[0]*pow(10,(mul[1]+mul[2]+mul[3]))+
                     n[1]*pow(10,(mul[2]+mul[3]))+n[2]*pow(10,mul[3])+n[3];
                     if(num%11==0)
                        {                    
                         digit_all=mul[0]+mul[1]+mul[2]+mul[3];
                        
                         for (i=0,digit_left=num;i<digit_all;i++)
                             {digit[i]=digit_left%10;
                              digit_left=digit_left/10;
                             }
                         for (i=0;i<digit_all;i++)
                             {num_turn=num_turn+digit[i]*pow(10,(digit_all-i-1));
                             }
                         if(num_turn%11==0)
                            {printf("zhengxu %ld\t",num);
                             printf("daoxu %ld\n",num_turn);
                             for (i=0;i<4;i++)
                                 printf("%d\t",n[i]);
                              printf("\n");
                              }
                       
                        }
                    }
     
}
2009-08-27 23:37
leetom
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2009-6-16
收藏
得分:0 
以下是引用pangding在2009-8-27 22:24的发言:
能被11整除的数的特点是:奇位上数的和 与 偶位上数的和 的差 是11的倍数(0也行)。
比如你说的341,(一般是从右数)奇位上的数是 1 和 3 ,和是4。偶位上是4。它们的差是4-4=0。因此它是341是11的倍数。
如果有这规律 ...
我感觉不能重吧~如果能重就在加上=~

这个程序有问题~谁能改一下~
把if(num_turn%11==0)改为if(num_turn%11!=0)输出的逆序数都是错的~
应该是不输出的吧~

2009-08-28 00:05
leetom
Rank: 1
等 级:新手上路
帖 子:7
专家分:2
注 册:2009-6-16
收藏
得分:0 
竟然今天就没问题了。。。。。谢ls几位~
2009-08-28 11:57
zglieren303
Rank: 1
等 级:新手上路
帖 子:29
专家分:1
注 册:2008-11-6
收藏
得分:0 
#include<stdio.h>
#include<math.h>
long reverse(long a);
int weishu(long a);
int fenjie(long a,int &a1,int &a2,int &a3,int &a4);

int main()
{

   
  long i;
  int a1,a2,a3,a4;
  for(i=1111;i<=99999999;i++)
  if (i%11==0)
  {  
      if(reverse(i)%11==0)
       {
         fenjie(i,a1,a2,a3,a4);
         if(a1>=a2 && a2>=a3 && a3>=a4 && a1<=36 && a2<=36 && a3<=36 && a4<=36)
         printf("%d %d %d %d \n",a1,a2,a3,a4);
       }
   }
  
  return 0;
  
}
long reverse(long a)
{
 int  m,k;
 long b=0,a1;
 a1=a;
 m=weishu(a1);
 while(m--)
{
  k=a1%10;
  a1=a1/10;
  b+=(long)(pow(10,m)*k);
}
 return b;
 
}
int weishu(long a)
{
  int m=1;
  long b=a;
  while(1)
  {
    a/=10;
    if (a==0) break;
    else m++;
   }
  return m;
}
int fenjie(long a,int &a1,int &a2,int &a3,int &a4)
{
  int m;
  long b=a;
  m=weishu(b);
  switch(m)
  {
  case 4:  {a4=b%10;a3=((int)(b/10))%10;a2=((int)(b/100))%10;a1=((int)(b/1000))%10;break;}
  case 5:  {a4=b%10;a3=((int)(b/10))%10;a2=((int)(b/100))%10;a1=((int)(b/1000))%100;break;}
  case 6:  {a4=b%10;a3=((int)(b/10))%10;a2=((int)(b/100))%100;a1=((int)(b/10000))%100;break;}
  case 7:  {a4=b%10;a3=((int)(b/10))%100;a2=((int)(b/1000))%100;a1=((int)(b/100000))%100;break;}
  case 8:  {a4=b%100;a3=((int)(b/100))%100;a2=((int)(b/10000))%100;a1=((int)(b/1000000))%100;break;}
  }
  return 0;
}



2010-04-05 01:50
zglieren303
Rank: 1
等 级:新手上路
帖 子:29
专家分:1
注 册:2008-11-6
收藏
得分:0 
交换顺序这样理解的话
如 36 36 25 13 组合成的数字是36362513
交换顺序后 13 25 36 36 组合成的数字是13253636 ,这两个数字是满足要求的。这样的答案一共有2851组!
上面的代码稍加修改  编程如下:(代码浅显未加注释,见谅)
#include<stdio.h>
#include<math.h>
long reverse(long a);
int weishu(long a);
int fenjie(long a,int &a1,int &a2,int &a3,int &a4);
int isPass(long a);

int main()
{
  long i,counts=0;
  int a1,a2,a3,a4;
  for(i=1111;i<=99999999;i++)
  if (i%11==0&& isPass(i) && reverse(i)%11==0)
  {   
         fenjie(i,a1,a2,a3,a4);
         printf("%d %d %d %d \n",a1,a2,a3,a4);
         counts++;
   }
  printf("答案个数:%ld",counts);
  
  return 0;
  
}
int isPass(long a)
{
    int a1,a2,a3,a4;
    long a0=a;
    fenjie(a0,a1,a2,a3,a4);
    if(weishu(a0)==weishu(a1)+weishu(a2)+weishu(a3)+weishu(a4) &&a1>=a2 && a2>=a3 && a3>=a4 && a1<=36 && a2<=36 && a3<=36 && a4<=36 &&a1>0 && a2>0 && a3>0 && a4>0)
    return 1;
    else
    return 0;
}
long reverse(long a)
{
 int  m,a1,a2,a3,a4;
 long b=0,a0;
 a0=a;
 m=weishu(a0);
 fenjie(a0,a1,a2,a3,a4);
switch(m)
  {
  case 4:  {b=a4*1000+a3*100+a2*10+a1;break;}
  case 5:  {b=a4*10000+a3*1000+a2*100+a1;break;}
  case 6:  {b=a4*100000+a3*10000+a2*100+a1;break;}
  case 7:  {b=a4*1000000+a3*10000+a2*100+a1;break;}
  case 8:  {b=a4*1000000+a3*10000+a2*100+a1;break;}
  }
 return b;
 
}
int weishu(long a)
{
  int m=1;
  long b=a;
  while(1)
  {
    a/=10;
    if (a==0) break;
    else m++;
   }
  return m;
}
int fenjie(long a,int &a1,int &a2,int &a3,int &a4)
{
  int m;
  long b=a;
  m=weishu(b);
  switch(m)
  {
  case 4:  {a4=b%10;a3=((int)(b/10))%10;a2=((int)(b/100))%10;a1=((int)(b/1000))%10;break;}
  case 5:  {a4=b%10;a3=((int)(b/10))%10;a2=((int)(b/100))%10;a1=((int)(b/1000))%100;break;}
  case 6:  {a4=b%10;a3=((int)(b/10))%10;a2=((int)(b/100))%100;a1=((int)(b/10000))%100;break;}
  case 7:  {a4=b%10;a3=((int)(b/10))%100;a2=((int)(b/1000))%100;a1=((int)(b/100000))%100;break;}
  case 8:  {a4=b%100;a3=((int)(b/100))%100;a2=((int)(b/10000))%100;a1=((int)(b/1000000))%100;break;}
  }
  return 0;
}




2010-04-06 13:11
快速回复:c语言数学题
数据加载中...
 
   



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

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