c语言 用0~9 这十个数字可以组成多少无重复的四位数?

同学们,我的问题是编程语言方面的哦,谢谢你们啦... 同学们,我的问题是编程语言方面的哦,谢谢你们啦 展开
 我来答
风若远去何人留
2016-01-14 · 知道合伙人互联网行家
风若远去何人留
知道合伙人互联网行家
采纳数:20412 获赞数:450113
专业C/C++软件开发

向TA提问 私信TA
展开全部

无重复四位数字,即各个数位数不重复,如1234等。类似于1123,或者4444,此类数字均不符合要求。

按照这个要求,对四位上的数字分别循环,当出现重复时不处理,无重复累加,遍历结束后输出结果即可。

代码如下:

int main()
{
    int a,b,c,d,r=0;
    for(a=1;a<10;a++)
    {
        for(b=0;b<10;b++)
        {
            if(b==a) continue;
            for(c=0;c<10;c++)
            {
                if(c == a || c == b)continue;
                for(d = 0; d<10;d++)
                {
                    if(d == a || d==b || d==c) continue;
                    r++;
                }
            }
        }
    }
    printf("共计有%d个\n", r);
}

运行输出:

共计有4536个

炒饭君vip
2015-06-16 · TA获得超过2334个赞
知道小有建树答主
回答量:1.3万
采纳率:38%
帮助的人:911万
展开全部
(1)如果是不严格的4位数,范围就是0000~9999,
(2)如果是严格的4位数,范围就是1000~9999
(3)无重复的4严格位数,那就得判断了,假设4位数为abcd
第一位 a 可以取1~9,共9个数,假设为a
第二位 b 可以取0~9,但与a要不同,所以有9个数
第三位 c 可以取0~9,但与ab都不同,所以有8个数
第四位 d 可以取0~9,但与abc都不同,所以有7个数

综上,为9*9*8*7种
这是通过推断出来的,如果用程序实现的话,
就for 四位数 从1000到9999,再判断这四个数是否有重复位(判断四位数是否有数字重复的方法就是每次对10求余再除10),没有重复的话数量+1,
输出最终结果就OK了

bool judge(int num){
int d=num%10;
int c=(num/10)%10;
int b=(num/100)%10;
int a=num/1000; // 这个好像不用求余了
if(a!=b && a!=c && a!=d && b!=c && b!=d && c!=d) return true;
else return false;

}

int main(){

int i=0,cnt=0;

for(i=1000;i<9999;i++){
if(judge(i) ) cnt++;

}
printf("%d\n",cnt);
return 0;

}
追问
亲,请问这个开头是不是还是要加上include?
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
匿名用户
2015-06-16
展开全部
1)因为最高位不能为 0 ,所以没有重复数字的四位数有 9*9*8*7=4536 个 ;
2)因为偶数的个位必为偶数,因此分两类:个位为 0 ;个位为 2 、4、6、8 ;
当个位为 0 时,有 1*9*8*7=504 个 ,
当个位为 2、4、6、8 时,有 4*8*8*7=1792 个 ,
因此偶数有 504+1792=2296 个 .
(也可以算出奇数有 5*8*8*7=2240 个,因此偶数有 4536-2240=2296 个)
追问
谢谢,不过,能不能用c语言??编程
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
eXistenZz
2015-06-16 · 超过14用户采纳过TA的回答
知道答主
回答量:30
采纳率:0%
帮助的人:23.2万
展开全部
#include <stdio.h>

int result = 0;

void permutations_helper(bool[], int, int, bool);

// k为取几位数,这里的话就是4,如果取0位数,不存在,直接返回0
void permutations(bool D[], int k) {
if (k == 0) return;
permutations_helper(D, 0, k, true);
}

// start和end只是一个计数,代表已经取了头几位数,如果start == end说明找到了一个符
// 合要求的数; firstDigit代表是不是第一位,防止出现0在首位的错误
// D[i]: true表示可以取,false表示之前取过了,不能再取了
void permutations_helper(bool D[], int start, int end, bool firstDigit) {
if (start == end) {
++result;
return;
}
int i;
for (i = 0; i < 10; ++i) {
if (D[i] && (!firstDigit || i != 0 || start + 1 == end)) {
D[i] = false;
permutations_helper(D, start + 1, end, false);
D[i] = true;
}
}
}

int main() {
bool D[10];
int i;
for (i = 0; i < 10; ++i) D[i] = true;
permutations(D, 1);
printf("%d", result);
return 0;
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
xtwgigu2
推荐于2017-09-10 · 超过41用户采纳过TA的回答
知道小有建树答主
回答量:54
采纳率:0%
帮助的人:76万
展开全部
//计算个数,并输出所有组合

void CopyArrayWithExcept(int a[], int nCount, int b[], int nExcept)
{
for(int i=0, j=0; i<nCount; i++)
{
if(i != nExcept)
{
b[j++] = a[i];
}
}
}

int GetXNumFromArray(int a[], int nArrayCount, int nGet, char* szPre)
{
if(nGet==1)
{
int nCount = 0;
for(int i=0; i<nArrayCount; i++)
{
printf("%s%d ", szPre, a[i]);
nCount++;
}

return nCount;
}
else
{
int nCount = 0;
for(int i=0; i<nArrayCount; i++)
{
if(strlen(szPre)==0 && (a[i]==0))
{
continue;
}

char szNewPre[20] = {0};
sprintf_s(szNewPre, "%s%d", szPre, a[i]);

int *nNewArray = new int[nArrayCount-1];
CopyArrayWithExcept(a, nArrayCount, nNewArray, i);

nCount += GetXNumFromArray(nNewArray, nArrayCount-1, nGet-1, szNewPre);

delete[] nNewArray;
}

return nCount;

}
}

int main(void)
{
int a[] ={0,1,2,3,4,5,6,7,8,9};
int nCount = GetXNumFromArray(a, 10, 4, "");

printf("\n%d", nCount);

return 0;
}
本回答被提问者采纳
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
收起 更多回答(4)
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式