數學黑洞6174
㈠ 關於數學黑洞6174(c程序)拜託各位大神
問題出在這一步: for(j=0;j<=3;j++) { a[j]=s%10; s=s%10; } 你沒理解求余符號的運算結果。 假如這里s = 1234 , 那麼第一次循環,a[0] = 1234 % 10 = 4; s = 1234 % 10 = 4; 那麼這個循環接下來還有作用嗎? 數組a的元素都是4. 當然對於輸入數組的范圍要求也有問題,因為題目要求的是各位數字各不相同,而你的判斷語句if((n%1111==0)&&(n>9999)&&(n<1000)) 是沒有任何功能的,因為哪會有一個整數既大於9999又小於1000呢? 還有下面對數組的排列,有太多方法,每一種都比你的簡單。試想,如果這個不是4位數,而是40位,你這種寫法,那豈不是能寫出幾千行的程序?
㈡ Free Pascal 之 數學黑洞6174
program sxhd;
var a,i,j,l,k:integer;
begin
readln(a);
while a<>6174 do
begin
i:=a div 1000;
j:=(a div 100)mod 10;
l:=(a mod 100)div 10;
k:=a mod 10;
a1:=i+10*j+100*l+1000*k;
if a1>a then writeln(a1,'-',a,'=',a1-a)
else writeln(a,'-',a1,'=',a-a1);
a:=abs(a-a1);
end;
readln;
end.
㈢ 數學黑洞6174。 已知:一個任意的四位正整數。將數字重新組合成一個最大的數和最小的數相減。重復這
var
a,b,c:longint;
s,s1,s2:string[4];
ch:char;
i,j,k,code:integer;
begin
{readln(s);}
s:='8899';
iflength(s)<>4thenwriteln('error');
k:=0;
repeat
inc(k);
fori:=1to3doforj:=i+1to4do
ifs[i]>s[j]then
beginch:=s[i];s[i]:=s[j];s[j]:=ch;end;
s1:=s;
fori:=1to2do
beginch:=s[i];s[i]:=s[5-i];s[5-i]:=ch;end;
s2:=s;
val(s1,a,code);
val(s2,b,code);
c:=b-a;
str(c:4,s);
writeln(a:6,b:6,c:6);
until(c=6174)or(k>20);
writeln(k);
end.
㈣ Pascal-數學黑洞6174。求證:所有四位數的數字(全相同的除外),均能得到6174。輸出掉進黑洞的步數
program asdf;
var
a:array[1000..9998] of integer;
b:array[1..24] of integer;
i,j,k,l,w,x,y,z,w1,x1,y1,z1,xx,yy,ii:Integer;
begin
for i:=1000 to 9998 do
begin
ii:=i;
w:=ii div 1000;
x:=ii div 100-w*10;
y:=ii div 10-w*100-x*10;
z:=ii mod 10;
if not((w=x)and(x=y)and (y=z)) then begin
yy:=1;
for j:=1 to 7 do
for w1:=1 to 4 do
for x1:=1 to 4 do
for y1:=1 to 4 do
for z1:=1 to 4 do
begin
if (w1+x1+y1+z1=1+2+3+4)and(w1*x1*y1*z1=1*2*3*4) then begin
for k:=1 to 4 do begin
xx:=1;
case k of
1:for l:=1 to w1 do begin xx:=xx*10; b[yy]:=b[yy]+w1; end;
2:for l:=1 to x1 do begin xx:=xx*10; b[yy]:=b[yy]+x1; end;
3:for l:=1 to y1 do begin xx:=xx*10; b[yy]:=b[yy]+y1; end;
4:for l:=1 to z1 do begin xx:=xx*10; b[yy]:=b[yy]+z1; inc(yy); end;
end;
end;
end;
end;
for k:=1 to 24 do
for l:=1 to k do
if b[k]>b[l] then begin b[k]:=b[l]+b[k]; b[l]:=b[k]-b[l]; b[k]:=b[k]-b[l]; end;
ii:=abs(b[k]-b[l]);
if ii=6174 then begin a[i]:=j; break; end;
end;
end;
end;
for i:=1000 to 9998 do
writeln(i,':',a[i]);
readln;
end.
㈤ 數學黑洞6174再實際中有什麼用
所謂數學黑洞,就是從給定的數字出發,在規定的運演算法則下,最終都將得到固定的一個值,再也跳不出去了。就像宇宙中的黑洞可以將任何物質,包括光都牢牢吸住,無法逃脫一樣。這樣的數字稱為「黑洞數」,這樣的運算叫做「重排求差」操作。例如,三位數的黑洞數為495 簡易推導過程:隨便找個數,如297,三個位上的數從小到大和從大到小各排一次,為972和279,相減,得693 按上面做法再做一次,得到594,再做一次,得到495 之後反復都得到495再如,四位數的黑洞數有6174
㈥ 用C語言做:數學黑洞6174 格式要找樣例一樣的哦!謝謝您!
#include <stdio.h>
#defineDST_NUM6174
void ReSort(char c[], int len);
int MaxNum(char c[], int len);
int MinNum(char c[], int len);
void GetChars(unsigned int num, char c[], int len);
int count = 0;
int func(unsigned int num)
{
int res;
char c[4];
GetChars(num, c, 4);
ReSort(c, 4);
res = MaxNum(c, 4) - MinNum(c, 4);
count++;
if(res == DST_NUM) return count;
return func(res);
}
void main()
{
unsigned int num;
while(scanf("%d", &num))
{
getchar();
printf("%d\n", func(num));
count = 0;
}
}
void GetChars(unsigned int num, char c[], int len)
{
for(int i = 0; i < len; i++)
{
c[i] = num % 10 + '0';
num = num / 10;
}
}
void ReSort(char c[], int len)
{
int i, j;
char tmp;
for(i = len - 1; i > 0; i--)
{
for(j = 0; j < i; j++)
{
if(c[j] > c[j+1])
{
tmp = c[j];
c[j] = c[j+1];
c[j+1] = tmp;
}
}
}
}
int MaxNum(char c[], int len)
{
unsigned int num = 0;
for(int i = len - 1; i >= 0; i--)
{
num *= 10;
num += (c[i] - '0');
}
return num;
}
int MinNum(char c[], int len)
{
unsigned int num = 0;
for(int i = 0; i < len; i++)
{
num *= 10;
num += (c[i] - '0');
}
return num;
}
㈦ 數學黑洞之一的6174,為什麼7749卻不行呢
取任意一個4位數(4個數字均為同一個數的除外),將該數的4個數字重新組合,形成可能的最大數和可能的最小數,再將兩者之間的差求出來;對此差值重復同樣過程,最後你總是至達卡普雷卡爾黑洞6174,至達這個黑洞最多需要7個步驟。
例如:
大數:取這4個數字能構成的最大數,本例為:4321;
小數:取這4個數字能構成的最小數,本例為:1234;
差:求出大數與小數之差,本例為:4321-1234=3087;
重復:對新數3087按以上演算法求得新數為:8730-0378=8352;
重復:對新數8352按以上演算法求得新數為:8532-2358=6174;
結論:對任何只要不是4位數字全相同的4位數,按上述演算法,不超過7次計算,最終結果都無法逃出6174黑洞;
對6174本身作此變換,7641-1467=6174;
對7749本身作此變換,9774-4779=4995,並非7749本身,所以7749肯定不是一個黑洞。如果你繼續變換下去,就會得到6174.