đây là đề thi olympic mà
do các chữ số của m đều khác nhau nên số lớn nhất là 0xFEDCBA9876543210
nên số cần nhỏ hơn 15*16/2=120
nếu không thì không có lời giải
tôi chỉ viết giải thuật in ra số ở hệ 16
nếu bạn muốn in ra ở hệ 10 thì tự đổi cơ số nhé
đây là 1 bài về xử lý số nguyên lớn đấy
không dễ đâu nhé
chú ý biên dịch bằng dev-c++
Code:
#include <stdio.h>
#include <conio.h>
#include <string.h>
#include <windows.h>
int main(void)
{
int n;
int a[17];
int sl,t,i,du,max[17];
printf("n= ");
scanf("%i",&n);
t=n;
i=1;
sl=0;
if(n>120)
{
printf("Khong co so nao thoa man");
getch();
ExitProcess(0);
}
while(t>0)
{
//printf("%i ",i);
t-=i;
++i;
++sl;
}
--i;
if((float)i*(i+1)/2>n)
sl--;
//printf("so chu so la %i",sl);
t=n;
for(i=1;i<=sl;++i)
{
t-=i;
}
du=t;
ZeroMemory(a,sizeof(a));
for(i=1;i<=sl;++i)
{
a[i]=i;
}
ZeroMemory(max,sizeof(max));
max[sl]=15;
for(i=sl;i>=1;--i)
{
max[i-1]=max[i]-1;
}
i=sl;
while(du>0)
{
if(du>(max[i]-a[i]))
{
a[i]=max[i];
du-=max[i];
--i;
}
else
{
a[i]+=du;
du=0;
}
}
printf("Ket qua viet trong he co so 16 la \n");
for(i=sl;i>=0;--i)
{
switch(a[i])
{
case 0:
printf("0");
break;
case 1:
printf("1");
break;
case 2:
printf("2");
break;
case 3:
printf("3");
break;
case 4:
printf("4");
break;
case 5:
printf("5");
break;
case 6:
printf("6");
break;
case 7:
printf("7");
break;
case 8:
printf("8");
break;
case 9:
printf("9");
break;
case 10:
printf("A");
break;
case 11:
printf("B");
break;
case 12:
printf("C");
break;
case 13:
printf("D");
break;
case 14:
printf("E");
break;
case 15:
printf("F");
break;
}
}
getch();
}
Bookmarks