当前位置: 代码迷 >> C语言 >> [求助]求0-7(1-8位数)所能组成的奇数个数,想得快崩溃了还想不出来
  详细解决方案

[求助]求0-7(1-8位数)所能组成的奇数个数,想得快崩溃了还想不出来

热度:158   发布时间:2007-04-15 12:55:54.0
#include "stdio.h"
main()
{float i,s=1,sum=1,SUM=4;
for(i=6;i>=1;i--)
{s=s*i;
sum=sum+s; //求出中间部分的排列个数的总和
printf("s=%f,sum=%f\n",s,sum);
}
SUM=SUM+4*6*sum;
printf("SUM=%f\n",SUM);
}
这样可能比较容易理解吧。

[此贴子已经被作者于2007-4-16 19:10:55编辑过]


----------------解决方案--------------------------------------------------------
//给LZ一个全排列程序作参考:
#include<stdio.h>
void QPL(int n)//全排列
{ int i;
static char ans[12+1];
static char src[]="123456789abc";
static int N;
if(N==0)N=n;
if(n>12)return;
for(i=0;i<N;i++)
if(src[i])
{ ans[N-n]=src[i];
src[i]=0;//表示已取走
if(n>1)QPL(n-1);
else printf("%s\t",ans);
src[i]=ans[N-n];//归还
}
}
void main()
{ int n;//待排列的元素个数
scanf("%d",&n);
QPL(n);
}
----------------解决方案--------------------------------------------------------
//从1到76543210(八进制)共有多少个奇数?
//限制:不准出现重复数字,如0311虽然是
//奇数,但'1'出现了不止一次,故否决。
//答案:46972
#include <stdio.h>
int OK(long int x)
{
int i,dig[8];
for(i=0;i<8;i++)
dig[i]=0;
while(x)
{
dig[x%8]++;
x/=8;
}
for(i=0;i<8;i++)
if(dig[i]>1)return 0;
return 1;
}
main( )
{
long int x,count=0;
for(x=1;x<076543210;x+=2)//每次加2,确保x==奇数
{
if(OK(x))count++;
}
printf("满足要求的奇数共有%ld个\n",count);
}
----------------解决方案--------------------------------------------------------
//以下涉及的均为八进制整数
#include<stdio.h>
main( )
{
printf("八进制(下同)的1位奇数有%ld个\n",4L);
printf("不含重复数字的2位奇数有%ld个\n",6L*4);
printf("不含重复数字的3位奇数有%ld个\n",6L*6*4);
printf("不含重复数字的4位奇数有%ld个\n",6L*5*6*4);
printf("不含重复数字的5位奇数有%ld个\n",6L*4*5*6*4);
printf("不含重复数字的6位奇数有%ld个\n",6L*3*4*5*6*4);
printf("不含重复数字的7位奇数有%ld个\n",6L*2*3*4*5*6*4);
printf("不含重复数字的8位奇数有%ld个\n",6L*1*2*3*4*5*6*4);
}
----------------解决方案--------------------------------------------------------
回复:(gsbe1987)[求助]求0-7(1-8位数)所能组...

可以按如下办法解决,但是世间复杂度有点大。我考虑过,统计那么都的数,世间复杂度相对还是较大些。很愿意和你探讨这个题目。我的联系方式:flyskyfile@163.com

(C++语言)

//---------------------------------------------------------------------------

#include <vcl.h>
#pragma hdrstop

//---------------------------------------------------------------------------

#pragma argsused
#include<iostream>
using namespace std;
int main(int argc, char* argv[])
{
for(int i=0;i<=7;++i)
for(int j=0;j<=7;++j)
for(int k=0;k<=7;++k)
for(int m=0;m<=7;++m)
for(int n=0;n<=7;++n)
for(int l=0;l<=7;++l)
for(int a=0;a<=7;++a)
for(int b=0;b<=7;++b)
{
if((10000000*i+1000000*j+100000*k+10000*m+1000*n+100*l+10*a+b)%2)cout<<(10000000*i+1000000*j+100000*k+10000*m+1000*n+100*l+10*a+b)<<endl;
}
return 0;
}
//---------------------------------------------------------------------------


----------------解决方案--------------------------------------------------------

顶26楼,跟我一样喜欢用穷举,简单就是美


----------------解决方案--------------------------------------------------------
  相关解决方案