c语言求数字黑洞问题
- 格式:doc
- 大小:25.50 KB
- 文档页数:2
基础回顾第2题2、已知:一个任意的四位正整数。
将数字重新组合成一个最大的数和最小的数相减,重复这个过程,最多七步,必得6174。
即:7641-1467=6174。
将永远出不来。
求证:所有四位数数字(全相同的除外),均能得到6174。
输出掉进黑洞的步数。
解:①主要硬件软件环境②设计思路:对输入的四位数n分别求出各位数字,并对各位数字重新排序,求出一个最大的四位数和最小的四位数,把最大的四位数和最小的四位数相减重新赋值给n,重复上述过程,当最后等于6174时结束循环③程序和运行结果:#include<iostream>int p(int n);//设计一个函数反复调用int n;using namespace std;void main(){int time=1,n1;cout<<"请输入一个四位正整数(各位数字全相同的除外):"<<endl;cin>>n;cout<<"掉进黑洞的步数:";if(n==6174)cout<<"0"<<endl;if(n!=6174){n1=p(n);while(n1!=6174){n1=p(n1);time++;}cout<<time<<endl;}}int p(int n){int a,b,c,d;int i,j,k,t;a=n/1000;//求各位数字b=(n-a*1000)/100;c=(n-a*1000-b*100)/10;d=(n-a*1000-b*100-c*10);int s[4]={a,b,c,d};//定义一个数组存放要排序的各位数字for(i=0;i<3;i++){k=i;for(j=i+1;j<4;j++)if(s[j]<s[k])k=j;t=s[k];s[k]=s[i];s[i]=t;//选择排序法s[0]到s[3]升序排列}int e=(s[3]*1000+s[2]*100+s[1]*10+s[0])-(s[0]*1000+s[1]*100+s[2]*10+s[3]);return e;}④小结(分析存在的问题)方法2#include<iostream>int p(int n);//设计一个函数反复调用using namespace std;void main(){int n,time=0;//步数置0cout<<"请输入一个四位正整数(各位数字全相同的除外):"<<endl;cin>>n;cout<<"掉进黑洞的步数:";if(n==6174)cout<<"0"<<endl;if(n!=6174){while(n!=6174){n=p(n);time++;}cout<<time<<endl;}}int p(int n){bool flag;int s[4],i,j,t;for(i=0;i<4;i++){s[i]=n%10;n=n/10;}for(i=0;i<4;i++){flag=false;for(j=0;j<3-i;j++){if(s[j]>s[j+1]){t=s[j];s[j]=s[j+1];s[j+1]=t;//冒泡排序法s[0]到s[3]升序排列flag=true;}}if(!flag)break;}int e=(s[3]*1000+s[2]*100+s[1]*10+s[0])-(s[0]*1000+s[1]*100+s[2]*10+s[3]);return e;}。
C语⾔·数字⿊洞算法提⾼数字⿊洞时间限制:1.0s 内存限制:256.0MB问题描述 任意⼀个四位数,只要它们各个位上的数字是不全相同的,就有这样的规律: 1)将组成该四位数的四个数字由⼤到⼩排列,形成由这四个数字构成的最⼤的四位数; 2)将组成该四位数的四个数字由⼩到⼤排列,形成由这四个数字构成的最⼩的四位数(如果四个数中含有0,则得到的数不⾜四位); 3)求两个数的差,得到⼀个新的四位数(⾼位零保留)。
重复以上过程,最后⼀定会得到的结果是6174。
⽐如:4312 3087 8352 6174,经过三次变换,得到6174输⼊格式 ⼀个四位整数,输⼊保证四位数字不全相同输出格式 ⼀个整数,表⽰这个数字经过多少次变换能得到6174样例输⼊4312样例输出3⽬的明确,题意很清晰的。
1 #include<stdio.h>2 #include<string.h>3 #include<stdlib.h>4int ans=0;5void sheng(int a[]){6for(int i=0;i<4-1;i++){7for(int j=0;j<4-i-1;j++){8if(a[j]>a[j+1]){9int t = a[j];10 a[j] = a[j+1];11 a[j+1] = t;12 }13 }14 }15 }16void jiang(int a[]){17for(int i=0;i<4-1;i++){18for(int j=0;j<4-i-1;j++){19if(a[j]<a[j+1]){20int t = a[j];21 a[j] = a[j+1];22 a[j+1] = t;23 }24 }25 }26 }27int tomax(int num){28int a[4]={0};29 a[0] = num/1000%10;//千位30 a[1] = num/100%10;//百位31 a[2] = num/10%10;//⼗位32 a[3] = num%10;//个位33 jiang(a) ;34return a[0]*1000+a[1]*100+a[2]*10+a[3];35 }36int tomin(int num){37int a[4]={0};38 a[0] = num/1000%10;//千位39 a[1] = num/100%10;//百位40 a[2] = num/10%10;//⼗位41 a[3] = num%10;//个位42 sheng(a) ;43return a[0]*1000+a[1]*100+a[2]*10+a[3];44 }45void dfs(int num){46if(num==6174){47return;48 }49 num=tomax(num)-tomin(num);50 ans++;51 dfs(num);52 }53int main(){54int num;55 scanf("%d",&num);56 dfs(num);57 printf("%d",ans);58return0;59 }。
你知道黑洞数有哪些吗?本人来告诉你有哪些黑洞数。
黑洞数的定义:由这个数每位上的数字组成的最大数减去每位数字组成的最小数仍然得到这个数自身。
例如,3位黑洞数是495,因为954-459=495。
现在告诉你几个黑洞数,3位黑洞数是495,4位黑洞数是6174,无5位黑洞数,6位黑洞数是549945、631764,无7位黑洞数,8位黑洞数是63317664、97508421,9位黑洞数是554999445、864197532。
用Python编制找出黑洞数的代码如下:def main(n):list1=[];list2=['已循环次数:']start=10**(n-1)end=10**n;j=int(start+(end-start)/10)for i in range(start,end):big=''.join(sorted(str(i),reverse=True))little=''.join(reversed(big))big,little=map(int,(big,little))if big-little==i:print('黑洞数:',i)list1.append(i)if i==j:print('已循环次数:',j-start)list2.append(j-start)j+=int((end-start)/10)if list1==[]:print('无',n,'位的黑洞数,','本次共循环次数i=',i+1)list1=['无黑洞数']list2.append(i+1)return list1,list2else:print('本次共循环次数i=',i-start+1)list1.insert(0,'黑洞数:')list2.append(i-start+1)return list1,list2with open(r'C:\黑洞数及循环次数.txt','a+') as fp: print(main(6),file=fp)。
三位数黑洞数的c语言程序1.引言1.1 概述引言:三位数黑洞数是一个神秘而有趣的数学现象,它在数论领域中备受研究和讨论。
通过对三位数黑洞数的定义和特点进行深入探究,我们可以更好地理解这一数学问题并通过C语言程序来实现它。
本文将首先介绍三位数黑洞数的定义,然后讨论其特点,最后给出一个用C语言编写的程序以实现三位数黑洞数。
通过对程序结果的分析和讨论,我们将得出结论并进一步探索三位数黑洞数的一些有趣性质。
本文的目的是帮助读者了解三位数黑洞数并通过编写C语言程序来掌握其实现方法。
通过阅读本文,读者将能够深入了解三位数黑洞数的概念、特点以及如何利用C语言来实现它。
这将有助于读者扩展自己在数学和编程领域的知识,并培养解决问题的能力。
1.2文章结构1.2 文章结构本文将按照以下结构进行展示:第一部分为引言,包括概述、文章结构和目的等内容。
在这一部分,我们将简要介绍本文的主题和内容,并说明本文的结构和目的。
第二部分为正文,分为两个小节。
首先,我们将对三位数黑洞数进行定义,并解释其特点和性质。
其次,我们将深入探讨三位数黑洞数的特点,包括其数字重组的规律和变化情况。
通过对三位数黑洞数的特点的分析,我们将更加深入地理解这一数学现象。
第三部分为结论,包含实现三位数黑洞数的C语言程序和对结果的分析与讨论。
我们将给出一个基于C语言的程序,用于生成三位数黑洞数,并对生成的结果进行分析和讨论。
通过实际的程序实现和结果分析,我们将验证和展示三位数黑洞数的特性和规律,为读者提供更直观和深入的理解。
通过以上结构的设计,本文将全面地介绍三位数黑洞数的定义、特点和生成方法。
读者可以通过阅读本文,了解到三位数黑洞数在数学中的重要性和特殊性,并掌握使用C语言生成黑洞数的方法和技巧。
同时,本文的实例和分析也能够促使读者对数学问题的思考和创新,拓宽数学领域的研究和应用。
文章1.3 目的部分的内容:本文的目的是设计并实现一个C语言程序,用于判断和生成三位数黑洞数。
数字黑洞c++语言数字黑洞是一个有趣而又数学性质强烈的问题。
它是一个数字漩涡,通过数学运算使得输入的数字最终收敛到一个特定的数字。
以下是使用C++语言实现数字黑洞的简单示例,其中以9876为例,说明数字黑洞的实现原理。
#include <iostream>#include <vector>#include <algorithm>using namespace std;// 将数字拆分成各位数字的函数vector<int>splitNumber(int num){vector<int>digits;while(num >0){digits.push_back(num %10);num /=10;}reverse(digits.begin(),digits.end());// 反转数组,使得最高位在最前面return digits;}// 将各位数字组合成一个数字的函数int combineDigits(const vector<int>&digits){int result =0;for(int digit :digits){result =result *10+digit;}return result;}// 数字黑洞的实现函数int digitBlackHole(int num){const int TARGET_NUMBER =6174;// 数字黑洞的目标数字// 循环直到达到数字黑洞while(num !=TARGET_NUMBER &&num !=0){// 拆分数字vector<int>digits =splitNumber(num);// 对数字进行升序和降序排列sort(digits.begin(),digits.end());int ascending =combineDigits(digits);sort(digits.rbegin(),digits.rend());int descending =combineDigits(digits);// 计算相减结果num =descending -ascending;cout <<descending <<" -"<<ascending <<" = "<<n um <<endl;}return num;}int main(){int inputNumber;cout <<"输入一个四位数:"<<endl;cin >>inputNumber;if(inputNumber <1000||inputNumber >=10000){cout <<"请输入一个四位数!"<<endl;return1;}cout <<"数字黑洞的最终结果:"<<digitBlackHole(inputNumbe r)<<endl;return0;}上述C++程序演示了如何实现数字黑洞,以输入的四位数为例。
C++初学者---五位数数字⿊洞问题数字⿊洞问题:任意⼀个五位数,调整其各位数字,分别组成⼀个最⼤数字和⼀个最⼩数字;将其差值再作为新的数(如果不⾜5位,则前边补0),再次进⾏上⼀操作,直到出现循环。
例如41679,⾸次得差值82962,继续进⾏,则产⽣75933,63954,61974。
由此构成⼀个循环数。
输⼊:41679输出:[82962,75933,63954,61974]某软件⼤赛题⽬(题⽬要求列出所有五位数,为便于调试和观察代码仅列出10个数,可⾃⾏修改循环条件遍历),解决思路如下:1、拆分各位数并保存,对拆分后的数排序、构造最⼤和最⼩值,求出差值;2、判断是否出现循环,出现即终⽌进⼊下⼀轮。
欢迎拍砖,^_^#include <iostream>#include <vector>#include <iomanip>using namespace std;// 从⼩到⼤快速排序void QuickSort(int *pdata, int start, int end){if (start >= end){return;}int itemp = start - 1;int key = pdata[end];int index;for (index = start; index < end; index++){if (pdata[index] < key) // 把⽐key⼩的数放在左边,⼤的放在右边。
确定分割点{swap(pdata[index], pdata[++itemp]);}}swap(pdata[itemp+1], pdata[end]);// 分成两部分后重排QuickSort(pdata, start, itemp);QuickSort(pdata, itemp + 2, end);}// 返回重新排列后的最⼤、最⼩数差值int BlackHole(int number){const int size = 5;int i = 0;int save[size];const int ten = 10;for (i = 0; i < size; i++){save[i] = number % ten; // 拆分整数并保存number /= ten;}QuickSort(save, 0, sizeof(save) / sizeof(save[0]) - 1);int max = 0;int min = 0;for (i = 0; i < size; i++){max += save[size - 1 - i]; // 构造最⼤、最⼩值max *= ten;min += save[i];min *= ten;}return (max - min) / ten;}// 判断最新结果与之前存取的是否有相同的,有返回true反之返回falsebool IsSame(int black){static vector<int> save; // 找到相同数之前,前⾯的数仍需保留⽤以⽐较,故⽤static,否则会清掉save.push_back(black);for (int i = 0; i < save.size(); i++){if (save[i] == black && (save.size() - 1) != i){save.clear(); // 若找到相同的数则清掉数据,进⾏下⼀个数的判断return true;}}return false;}int main(int argc, char **argv){for (int i = 10000; i < 10011; i++){int temp = BlackHole(i);cout << i << ": " ;while (false == IsSame(temp)) // 找到相同的数即终⽌进⼊下⼀轮 {cout << setw(5) << temp << '\t' ;temp = BlackHole(temp);}//cout << temp << endl;cout << endl;}//cout << BlackHole(97911);cout << endl;return0;}。
黑洞陷阱c语言黑洞陷阱是一个经典的算法问题,通常用于测试编程技能和解决问题的能力。
这个问题要求编写一个程序,该程序接受一个整数数组,并找到一个“黑洞”元素,该元素将数组中的其他元素“吸引”到黑洞中,即每个元素被黑洞吸引后,数组中只剩下一个元素,即黑洞。
下面是一个使用C语言解决黑洞陷阱问题的示例代码:c#include <stdio.h>int main() {int arr[] = {1, 2, 3, 4, 5};int n = sizeof(arr) / sizeof(arr[0]);int i, j, sum = 0;int blackhole;// 计算数组元素的总和for (i = 0; i < n; i++) {sum += arr[i];}// 找到黑洞元素for (i = 0; i < n; i++) {if (sum == 0) {blackhole = arr[i];break;}if (arr[i] == sum) {blackhole = arr[i];break;}sum -= arr[i];}// 将数组中的其他元素“吸引”到黑洞中for (i = 0; i < n; i++) {if (arr[i] != blackhole) {sum += arr[i];}}// 输出结果printf("The blackhole element is %d\n", blackhole);printf("The remaining elements after attracted by the blackholeare %d\n", sum);return 0;}在上面的代码中,我们首先定义了一个整数数组arr,并计算了数组元素的总和。
然后,我们使用一个循环遍历数组,找到黑洞元素。
最后,我们使用另一个循环将数组中的其他元素“吸引”到黑洞中,并输出结果。
用C#求证“黑洞数”作者:暂无来源:《发明与创新·中学生》 2016年第5期文湖南省安仁县第一中学高417班张坤武一、何为“黑洞数”黑洞是茫茫宇宙中的神秘天体。
黑洞密度极大,引力极强,任何物质经过它的附近,都会被它吸进去。
曾有人猜测,百慕大三角洲的飞机和轮船离奇失踪,可能就是遭遇了黑洞。
当然,这一猜测从未得到公开、正确的科学解释。
在浩瀚无垠的数学宇宙中,也存在“黑洞”之说,即取任意一个数字不重复的三位数或四位数,将该数字重新组合成可能的最大数和最小数后求差,再将这个差重复同样的过程,经过有限次的重复,最后总是得到同一个差,这个差就被称为“黑洞数”。
如数字6、7、8、9,重新组合成的最大数为9876、最小数为6789,按照上述方法的计算结果是:9876-6789=3087,8730-378=8352,8532-2358=6174,7641-1467=6174,之后不论如何计算,结果都是6174,6174即四位数的“黑洞数”。
6174是所有不重复四位数的“黑洞数”吗?C#语言可以帮我们找出答案。
二、求证过程C#是微软开发的基于.net平台的编程语言,集windows开发和web应用于一体,功能强大,使用方便。
1.了解解题思路由“黑洞数”的得出过程可知,任意一个无重复数的四位数或三位数,按照指定的规则重新组合、求差,然后重复这一过程,最后可得出“黑洞数”。
对此,可用中文伪代码表示为“函数求黑洞(整数型参数)”,返回值为“差”,然后迭代循环执行“函数求黑洞”(“差”),直到得出一个不再变化的“差”,这个“差”即为黑洞数。
这个算法用编程专业术语叫“递归”,即函数自己调用自己。
2.将算法变为代码C#的控制台编程简单明了,点击“文件”-“新建”-“项目”,选择“控制台应用程序”即可。
由以上伪代码可知,首先需定义一个求黑洞的函数,具体实现如下。
以上二十多行代码即完成了求黑洞数功能。
但如果一个一个地将数字输入求证,未免是用宰牛刀杀鸡,所以,还可用C#来实现,即让程序自动赋值100至999,或从1000到9999,让求黑洞函数进行求证,并将结果显示。
#include <stdio.h>
int n;////用于【临时】存储输入的5位数,以及以后计算的最大值和最小值的差值(递归算法)。
int m[100],flag=0;///m[100]用于存放输入的5位数,以及计算出的最大值和最小值的差值;
///flag用于记录数组m的最后一个不为零的下标(或者说是递归的次数)。
fun()
{
int temp[5];
int i,j,t;
int max=0,min=0;
////如果n是四位数则在前面补0
if(n<10000)
temp[0]=0;
temp[0]=n/10000;
temp[1]=n/1000%10;
temp[2]=n/100%10;
temp[3]=n/10%10;
temp[4]=n%10;
////////如果五个数字全部相等
if(temp[0]==temp[1] && temp[1]==temp[2] &&
temp[2]==temp[3] && temp[4]==temp[5])
{
printf("[0]\n");
return;
}
///////////从大到小进行排序
for(i=0;i<5;i++)
for(j=i+1;j<5;j++)
if(temp[i]<temp[j])
{
t=temp[i];
temp[i]=temp[j];
temp[j]=t;
}
////求出最大值
for(i=0;i<5;i++)
max=max*10+temp[i];
////求出最小值
for(i=4;i>=0;i--)
min=min*10+temp[i];
////求出差值,并且赋值给n,以便进行递归计算
n=max-min;
////n的值与数组中的每个元素进行比较
for(i=0;i<flag;i++)
if(n==m[i])////如果有相等的则从i开始到数组结尾是数字黑洞
{
printf("[");
for(j=i;j<flag;j++)
printf("%d,",m[j]);
printf("]\n");
return ;
}
m[flag++]=n;
fun();
}
void main()
{
scanf("%d",&n);
m[0]=n;
flag++;
fun();
}。