❶ 解九連環用c語言寫成程序怎麼寫
#include<stdio.h>
static int upstep = 0;
static int downstep = 0;
void UpRing(int n); /*加上函數說明,否則編譯將會出一點小錯誤*/
void DownRing(int n) /*下環的邏輯就體現在這里*/
{
❷ 求九宮問題程序(C語言實現)
【轉】
/*九宮圖演算法說明:根據分析,九宮圖中間一位一定是5,另外關於中間位置
對稱的每兩個數字相加等於10,所以對於一個九宮圖只通過其相鄰位置的數
字就能計算出其他所有位置的數字,而且相鄰位置的數字必然一個比5大,一
個比5小
演算法設計思想:先根據選取規則,從剩下八個數裡面選一大一小,再使用目
標函數檢測選取是否正確,如果正確則列印出,否則重新選取,選數的過程
使用回溯法*/
#include<stdio.h>
int place(int*);
void main(void){/*九宮圖演算法*/
int a[9]={1,2,3,4,5,6,7,8,9};
int b[9]={0};/*表示數字的位置狀態*/
int j,k,i;
for(k=0;k<=3;k++){/*對於所有比5小的數*/
b[1]=a[k];/*選一比5小的數放到第一行第二列*/
for(j=8;j>=5;j--){/*對於所有比5大的數*/
if(k!=(8-j)){/*不選擇前面已選小數所對應的大數*/
b[0]=a[j];/*選一比5大的數放到第一行第一列*/
if(place(b)){/*若得到一解,則列印出*/
printf("\n 九宮圖\n\n");
for(i=0;i<=8;i++){
printf(" %d ",b[i]);
if((i+1)%3==0){
printf("\n\n\n");
}
}
getch();
exit(0);
}
} /* 回溯到上一級*/
} /*回溯到根一級 */
}
}
int place(int*p){ /*計算出其他位置的數字並檢測是否為所求的解*/
p[2]=15-p[0]-p[1];
p[4]=5;
p[6]=10-p[2];
p[3]=15-p[0]-p[6];
p[5]=10-p[3];
p[7]=10-p[1];
p[8]=10-p[0];
if(p[2]+p[5]+p[8]==p[6]+p[7]+p[8]){/*其他行和列已通過計算檢測了,只有第三行,第三列未檢測*/
return(1);
}
else{
return(0);
}
}
【轉】
///////////////////////////////////////
// 九宮圖演算法;
//////////////////////////////////////
#include<sio.h>
#include<time.h>
#include<slib.h>
//////////////////////////////////
//// the function defination
//////////////////////////////////
void create(int [][3]);
void show(int [][3]);
void set_value(int [][3]);
void aim_get(int [][3]);
void target(int [][3]);
void judge_x1(int [][3]);
void judge_x2(int [][3]);
void judge_x3(int [][3]);
void judge_x4(int [][3]);
void judge_x5(int [][3]);
void shift_all(int [][3]);
void shift_low_six(int [][3]);
void anti_shift_all(int [][3]);
void shift_low_four(int [][3]);
void last_shift(int [][3]);
void set_x5(int [][3]);
///////////////////////////////////////
////// the main function body ////
////////////////////////////////////////
main()
{
srand(time(NULL));
int cDiagram[3][3];
create(cDiagram); /////// creat the new array ,set the value are 10;
set_value(cDiagram);
//last_shift(cDiagram);
return 0;
}
///////////////////////////////////////
/// 建立一個3*3數組,初值都設為10;//
//////////////////////////////////////
void create(int array[][3])
{
printf("\n\n***********************************\n\n");
printf("九宮圖演算法實現過程\n\n");
printf("***********************************\n\n");
int line;
int row;
for(line=0;line<3;line )
{
for(row=0;row<3;row )
{
array[line][row]=10;
}
}
// set_value(array);
//show(array);
}
/////////////////////////////////////////
/// 顯示數組狀態 ////
////////////////////////////////////////
void show(int array[][3])
{
for(int i=0;i<3;i )
{
for(int j=0;j<3;j )
{
printf("=",array[i][j]);
}
printf("\n\n");
}
}
///////////////////////////////
/// 產生數組的初始狀態 ///////
///////////////////////////////
void set_value(int array[][3])
{
int i=0;
int rand_num_line;
int rand_num_row;
printf(" \n\n九宮圖的初始值為:\n\n");
while(i<=8)
{
rand_num_line=rand()%3;
rand_num_row=rand()%3;
if(array[rand_num_line][rand_num_row]!=i&& array[rand_num_line][rand_num_row]==10)
{
array[rand_num_line][rand_num_row]=i;
i;
}
}
show(array);
//printf(" let's begin!!\n");
aim_get(array);
}
////////////////////////////////////////////////////////
//// judge the initial array get the target or no ! ///
//////////////////////////////////////////////////////////
void aim_get(int array[][3])
{
int aim[3][3]={{1,2,3},{8,0,4},{7,6,5}};
int line;
int row;
int judge=0;
for(line=0;line<3;line )
{
for(row=0;row<3;row )
{
if(array[line][row]!=aim[line][row])
{
judge=1;
}
}
}
if(judge==1)
{
judge_x1(array);
}
else
{
target(array);
}
}
/////////////////////////////////////
/////// the target diagram //////////
/////////////////////////////////////
void target(int array[][3])
{
printf("\n\n the last diagram is :\n");
show(array);
}
////////////////////////////////////
///judge the x1 is 1 or no! ///////
////////////////////////////////////
void judge_x1(int array[3][3])
{
//int x1=1;
int temp;
//printf(" \n\n\n the array[0][2]=%d\n\n",array[0][2]);
if(array[0][2]!=1 && array[0][2]!=0) // x3!=1 || x3!=0;
{
while(array[0][0]!=1)
{
//printf("i am here!!1");
temp=array[0][0];
array[0][0]=array[0][1];
array[0][1]=array[1][1];
array[1][1]=array[1][2];
array[1][2]=array[2][2];
array[2][2]=array[2][1];
array[2][1]=array[2][0];
array[2][0]=array[1][0];
array[1][0]=temp;
}
}
else
{
if(array[0][2]==0) // x3==0;
{
// printf("\n\n array[0][2]=0\n\n");
temp=array[0][2];
array[0][1]=array[0][2];
array[0][2]=temp;
judge_x1(array);
goto tt;
}
else /// x3==1;
{ //printf("\n\narray[0][2] should is 1, %d",array[0][2]);
if(array[1][1]==0) //// x0==0;
{
temp=array[0][1];
array[0][1]=array[1][1];
array[1][1]=temp;
judge_x1(array);
}
else //// x3==1 && x0!=0;
{
shift_all(array);
judge_x1(array);
}
}
}
printf(" 確定了X1位置後,九宮圖為:\n");
❸ 九連環的步驟計算
九連環是中國漢族民間玩具。規定環在桿上用1表示,環在下面用0表示。規定最左邊的環是可以任意上下的那一環,輸出數據中最右邊必須是1,也就是說,010100要寫成0101。
現今是X連環,由於「輸出數據中最右邊必須是1」,所以X可以理解為無限大,右邊多餘的0在輸出時都省略。初始化各環都是0,以下是前9步的情況:
1.1
2.11
3.01
4.011
5.111
6.101
7.001
8.0011
9.1011
問在X連環裝上過程中,第n步完成後,具體情況是怎麼樣的。
答案:將n轉化為二進制,求其格雷碼。將二進制的格雷碼逆序輸出,即得具體情況。
注意:這個演算法揭示了傳統的九連環與現代的格雷碼的重要關系! (C語言):
#include<stdio.h>
main()
{ __int64 n;
int a[70]=,num=0,i;
scanf(%I64d,&n);
if(n==0)
{ printf(0);
return 0;
}
while(n>0)
{ a[num++]=n%2;
n/=2;
}
for(i=0;i<num;i++)
a=a^a[i+1];
while(a[num]==0)
num--;
for(i=0;i<=num;i++)
printf(%d,a);
}
(Pascal語言):
var t:int64; n:shortint;
procere jie(z:shortint);procere tao(z:shortint);beginif z>1 thentao(z-1);inc(t);writeln(t,': put up ',z);if z>1 thenjie(z-1);end;
beginif z>1 thentao(z-1);inc(t);writeln(t,': put down ',z);if z>1 thenjie(z-1);end;
procere N_Lian_Huan(z:shortint);beginif z>2 thenN_Lian_Huan(z-2);inc(t);writeln(t,': put down ',z);if z>1 thenjie(z-1);end;
beginread(n); t:=round(exp(ln(2)*(n+1)));write(' Total steps:');if odd(n) thenwriteln((t-1)div 3)else writeln((t-2)div 3);t:=0;N_Lian_Huan(n);end. 方法一:首先你不斷地數1,2,1,2,1,2,1……
數1的時候上或下第1個環
數2的時候先看看從第一個環數起第一個在框上的環是第幾個,就上/下它的下一個環。如:第1個在框上,則只需上/下第2個環;
第1至第5個都在框下,第6個在框上就上/下第7個環。
一直,堅持數完341個數就解出來了。
方法二:解九連環,首先要知道1、2環怎麼解開,會拆1、2環(如何拆卸請見第一步),就能拆後面的環了。
拆卸方法
第一環:把第一環從左邊拿起,從上面放下。(有圖解,每環步驟均相同)(綠紅方塊幫助辨別方向,箭頭指引移動方向) 重要步驟!
第二環:和第一環步驟一樣(第一環不能先下)。
拆卸提示(順序)
卸下第一環
卸下第三環
卸下第二環
卸下第五環
用前面的方法裝上第三環,此時可卸下第四環。
卸下第三環和更左邊的環。
卸下第七環
裝上第五環,卸下第六環。
裝上第四環,卸下第五環。
......卸完為止。
卸下第九環,離成功更進一步。
想辦法卸下第八環。
想辦法卸下更前面的環。
大功告成(其實有一百多個步驟)
❹ 求九連環的解法
九連環步驟計算
九連環是中國民間玩具。規定環在桿上用1表示,環在下面用0表示。規定最左邊的環是可以任意上下的那一環,輸出數據中最右邊必須是1,也就是說,010100要寫成0101。
現在是X連環,由於「輸出數據中最右邊必須是1」 ,所以X可以理解為無限大,右邊多餘的0在輸出時都省略。初始化各環都是0,以下是前9步的情況:
1 1
2 11
3 01
4 011
5 111
6 101
7 001
8 0011
9 1011
問在X連環裝上過程中,第n步完成後,具體情況是怎麼樣的。
答案:將n轉化為二進制,求其格雷碼。將二進制的格雷碼逆序輸出,即得具體情況。
注意:這個演算法揭示了傳統的九連環與現代的格雷碼的重要關系!
程序實現(C語言):
#include<stdio.h>
main()
{ __int64 n;
int a[70]=,num=0,i;
scanf("%I64d",&n);
if(n==0)
{ printf("0");
return 0;
}
while(n>0)
{ a[num++]=n%2;
n/=2;
}
for(i=0;i<num;i++)
a=a^a[i+1];
while(a[num]==0)
num--;
for(i=0;i<=num;i++)
printf("%d",a);
}
❺ C語言程序設計:c=m!/(n!*(m-n)!)
C(n,m)=n!/(m!*(n-m)!),C(n,m)=p1a1-b1-c1p2a2-b2-c2…pkak-bk-ck,n<=10,000,000
[cpp]
#include<cstdio>
constintmaxn=1000000;
#include<vector>
usingnamespacestd;
boolarr[maxn+1]={false};
vector<int>proce_prim_number()
{
vector<int>prim;
prim.push_back(2);
inti,j;
for(i=3;i*i<=maxn;i+=2)
{
if(!arr[i])
{
prim.push_back(i);
for(j=i*i;j<=maxn;j+=i)
arr[j]=true;
}
}
while(i<maxn)
{
if(!arr[i])
prim.push_back(i);
i+=2;
}
returnprim;
}
//計算n!中素數因子p的指數
intcal(intx,intp)
{
intans=0;
longlongrec=p;
while(x>=rec)
{
ans+=x/rec;
rec*=p;
}
returnans;
}
//計算n的k次方對m取模,二分法
intpow(longlongn,intk,intM)
{
longlongans=1;
while(k)
{
if(k&1)
{
ans=(ans*n)%M;
}
n=(n*n)%M;
k>>=1;
}
returnans;
}
//計算C(n,m)
intcombination(intn,intm)
{
constintM=10007;
vector<int>prim=proce_prim_number();
longlongans=1;
intnum;
for(inti=0;i<prim.size()&&prim[i]<=n;++i)
{
num=cal(n,prim[i])-cal(m,prim[i])-cal(n-m,prim[i]);
ans=(ans*pow(prim[i],num,M))%M;
}
returnans;
}
intmain()
{
intm,n;
while(~scanf("%d%d",&m,&n),m&&n)
{
printf("%d ",combination(m,n));
}
return0;
}
(5)九連環規律c語言擴展閱讀
C語言N項規律數和
#include"stdio.h"
#include"stdlib.h"
main()
{
intk=1,m=2;
intn,i,j;
scanf("%4d",&n);
j=1;
printf("%4d",k);
for(i=1;i<n;i++)
{
if(k==m)
{
j=-1;
m=m+1;
}
elseif(k==1)
{
j=1;
k=k+j;
printf("%4d",k);
}
printf(" ");
}
}
❻ C語言:有n人圍成一圈,順序排號。從第1個人開始報數(從1到3報數),凡報到3的人退出圈子,
法一(模擬法):
#include<iostream>
usingstd::cin;
usingstd::cout;
intmain()
{
intn;
cout<<"請輸入n=";
cin>>n;
if(n<2)
{
cout<<"n必須大於2! 請重新輸入n=";
cin>>n;
}
bool*a=newbool[n+1];
a[0]=false;
for(inti=1;i<n+1;i++)
a[i]=true;
intx,k=n;x=i=0;//i為每次循環計數變數,x為人員序號,K為剩餘人數
while(k!=0)
{
x++;
if(x>n)x=1;//當人員到達數組尾,序號重設為1
if(a[x])i++;//跳過已退出人員
if(i==3)
{a[x]=false;i=0;k--;}//當數到3時,退出人員設為false,剩餘人數減1,i設為0,重新計數
}
cout<<"留下來的人序號為:"<<x<<" ";
delete[]a;
cin.get();
cin.get();//等待下一次鍵擊關閉窗口
return0;
}
法二(遞歸法):
此題可用數學方法求解。
設有n個人(編號0~(n-1)),從0開始報數,報到(m-1)的退出,剩下的人繼續從0開始報數 (用數學方法解的時候需要注意應當從0開始編號,因為取余會取到0解。)
實質是一個遞推,n個人中最終留下來的序號與n-1個人中留下來的人的序號有一個遞推關系式。
假設除去第k個人,則
0, 1, 2, 3, ..., k-2, k-1, k, ..., n-1 // 原始序列(1)
0, 1, 2, 3, ..., k-2, , k, ..., n-1 // 除去第k人,即除去序號為k-1的人 (2)
k, k+1, ..., n-1, 0, 1, ..., k-2// 以序號k為起始,從k開始報0 (3)
0, 1, ..., n-k-1, n-k, n-k+1, ..., n-2 // 作編號轉換,此時隊列為n-1人 (4)
變換後就完完全全成為了(n-1)個人報數的子問題,注意(1)式和(4)式,是同一個問題,不同的僅僅是人數。比較(4)和(3),不難看出,0+k=k, 1+k=k+1, ... ,(3)式中'0'後面的數字,
((n-3)+k)%n=k-3,((n-2)+k)%n=k-2, 對於(3)式中'0'前面的數字,由於比n小,也可看作(0+k)%n=k, (1+k)%n=k+1, 故可得出規律:
設(3)中某一數為x' , (4)中對應的數為x,則有:x'=(x+k)%n.
設x為最終留下的人序號時,隊列只剩下1人時,顯然x=0; 此時可向前回溯至2人時x對應的序號,3人時x對應的序號……直至n人時x的序號,即為所求。
#include<iostream>
usingnamespacestd;
constintm=3;
intmain()
{
intn,f=0;
cin>>n;
for(inti=2;i<=n;i++)
f=(f+m)%i;
cout<<f+1<<endl;
}
❼ 九連環解法
不用多想
最簡單的解法就是這個
只是數學家證明過的
九連環的拆解和安裝方法是採用遞歸的方法。只此一法,別無它途。這是由其拆解原理決定的:
解開九連環共需要三百四十一步,只要上或下一個環,就算一步。九連環的解下和套上是一對逆過程。
九連環的每個環互相制約,只有第一環能夠自由上下。要想下/上第n個環,就必須滿足兩個條件(第一個環除外):①、第n-1個環在架上;②、第n-1個環前面的環全部不在架上。
玩九連環的過程就是要一直滿足這兩個條件的過程。
拆解九連環,本質上要從後面的環開始解下。而先下前面的環,是為了下後面的環,前面的環還要裝上,不算是真正地取下來。
一、九連環拆解全過程
共341步:
下1,下3,上1下12下5,
上12下1上3、上1下12下4、上12下1下3、上1下12下7,
上12下1上3、上1下12上4、上12下1下3、上1下12上5、
上12下1上3、上1下12下4、上12下1下3、上1下12下6、
上12下1上3、上1下12上4、上12下1下3、上1下12下5、
上12下1上3、上1下12下4、上12下1下3、上1下12下9,
上12下1上3、上1下12上4、上12下1下3、上1下12上5、
上12下1上3、上1下12下4、上12下1下3、上1下12上6、
上12下1上3、上1下12上4、上12下1下3、上1下12下5、
上12下1上3、上1下12下4、上12下1下3、上1下12上7、
上12下1上3、上1下12上4、上12下1下3、上1下12上5、
上12下1上3、上1下12下4、上12下1下3、上1下12下6、
上12下1上3、上1下12上4、上12下1下3、上1下12下5、
上12下1上3、上1下12下4、上12下1下3、上1下12下8,
上12下1上3、上1下12上4、上12下1下3、上1下12上5、
上12下1上3、上1下12下4、上12下1下3、上1下12上6、
上12下1上3、上1下12上4、上12下1下3、上1下12下5、
上12下1上3、上1下12下4、上12下1下3、上1下12下7,
上12下1上3、上1下12上4、上12下1下3、上1下12上5、
上12下1上3、上1下12下4、上12下1下3、上1下12下6,
上12下1上3、上1下12上4、上12下1下3、上1下12下5,
上12下1上3、上1下12下4,上12下1下3,上1下21。
二、九連環安裝全過程
共341步:
上12下1上3,上1下12上4,上12下1下3、上1下12上5,
上12下1上3、上1下12下4、上12下1下3、上1下12上6,
上12下1上3、上1下12上4、上12下1下3、上1下12下5、
上12下1上3、上1下12下4、上12下1下3、上1下12上7,
上12下1上3、上1下12上4、上12下1下3、上1下12上5、
上12下1上3、上1下12下4、上12下1下3、上1下12下6、
上12下1上3、上1下12上4、上12下1下3、上1下12下5、
上12下1上3、上1下12下4、上12下1下3、上1下12上8,
上12下1上3、上1下12上4、上12下1下3、上1下12上5、
上12下1上3、上1下12下4、上12下1下3、上1下12上6、
上12下1上3、上1下12上4、上12下1下3、上1下12下5、
上12下1上3、上1下12下4、上12下1下3、上1下12下7、
上12下1上3、上1下12上4、上12下1下3、上1下12上5、
上12下1上3、上1下12下4、上12下1下3、上1下12下6、
上12下1上3、上1下12上4、上12下1下3、上1下12下5、
上12下1上3、上1下12下4、上12下1下3、上1下12上9,
上12下1上3、上1下12上4、上12下1下3、上1下12上5、
上12下1上3、上1下12下4、上12下1下3、上1下12上6、
上12下1上3、上1下12上4、上12下1下3、上1下12下5、
上12下1上3、上1下12下4、上12下1下3、上1下12上7,
上12下1上3、上1下12上4、上12下1下3、上1下12上5,
上12下1上3,上1。
❽ 用C語言編程解九連環
#include<stdio.h>
static int upstep = 0;
static int downstep = 0;
void UpRing(int n); /*加上函數說明,否則編譯將會出一點小錯誤*/
void DownRing(int n) /*下環的邏輯就體現在這里*/
{
if(n>2) DownRing(n-2);
printf("DW:%d\t",n);++downstep;
if(n>2) UpRing(n-2);
if(n>1) DownRing(n-1);
}
void UpRing(int n) /*上環的邏輯則體現在這里*/
{
if(n>1) UpRing(n-1);
if(n>2) DownRing(n-2);
printf("UP:%d\t",n);++upstep;
if(n>2) UpRing(n-2);
}
int
main(int argc, char **argv) /*簡潔的主函數*/
{
if(argc < 2)
{
puts("Usage:./jiulianhuan 9");
return -1;
}
int rings = atoi(argv[1]);
puts("Starting...");
DownRing(rings);
puts("\nEnding...")
printf("\nup = %d\tdown = %d\n",upstep,downstep);
return 0;
}
❾ C語言編程問題:求 1!+2!+3!+...+n!
int和long分配的內存空間長度不一樣,表示的數值范圍不一樣。比如可能int有32位的空間,long有64位的空間。n=17超出了整數的表示範圍。
這跟編譯器的實現方式有關,還與機器的位數有關。比如一個機器用8位表示整型,表示的范圍是-128~127(-2^7 ~2^7 -1)。
同理可以計算32位整型的情況。如果超出了這個范圍比如128,有的編譯器處理的方式就是 -128.類似於一個環,129存儲成 -127,long也是這個規律。但是c語言只保證long不小於int,32位機器上long也是32位的跟整型是一樣的。
(9)九連環規律c語言擴展閱讀:
C語言包含的各種控制語句僅有9種,關鍵字也只有32個,程序的編寫要求不嚴格且以小寫字母為主,對許多不必要的部分進行了精簡。實際上,語句構成與硬體有關聯的較少,且C語言本身不提供與硬體相關的輸入輸出、文件管理等功能,如需此類功能,需要通過配合編譯系統所支持的各類庫進行編程,故c語言擁有非常簡潔的編譯系統。
C程序中函數的數目實際上是不限的,如果說有什麼限制的話,那就是,一個C程序中必須至少有一個函數,而且其中必須有一個並且僅有一個以main為名的函數,這個函數稱為主函數,整個程序從這個主函數開始執行。