📄 pi.x
字号:
const int LimitN = 1000;
void sys_putchar(char c)
{
%asm {
%writereg("r2", c);
%asm("LI", "r0", "1");
%asm("INT", "3");
%asm("BNEZ", "r1", "-2");
%asm("NOP");
};
}
void puts(char *s)
{
int i;
for (i=0;*(s+i)!=0;i++)
sys_putchar(s[i]);
}
void puthex(int num)
{
int i,j;
for (i=0;i<4;i++)
{
j = ((num & 0xF000) >> 12);
num = (num << 4);
if (j < 10)
sys_putchar((char)(j+48));
else sys_putchar((char)(j+55));
}
}
int sys_getchar()
{
int ret;
%asm {
%asm("LI", "r0", "2");
%asm("INT", "3");
%asm("BNEZ", "r1", "-2");
%asm("NOP");
%readreg("r2", ret);
};
sys_putchar((char) ret);
return ret;
}
int getdec()
{
char ch;
while ((ch = (char)sys_getchar()) <= 32);
int ret; ret = 0;
while (ch >= '0' && ch <= '9')
{
ret = (ret << 3) + (ret << 1) + (int)ch - 48;
ch = (char)sys_getchar();
}
return ret;
}
int mul(int a, int b)
{
int ret;
%asm {
%asm("LW", "r7", "r0", "3");
%asm("LW", "r7", "r1", "4");
%asm("LI", "r2", "0");
%asm("LI", "r3", "1");
%asm("BEQZ", "r1", "8");
%asm("MOVE", "r6", "r1");
%asm("AND", "r6", "r3");
%asm("BEQZ", "r6", "2");
%asm("SRL", "r1", "r1", "1");
%asm("ADDU", "r2", "r0", "r2");
%asm("SLL", "r0", "r0", "1");
%asm("BNEZ", "r1", "-6");
%asm("MOVE", "r6", "r1");
%readreg("r2", ret);
};
return ret;
}
int div(int a, int b, int* mod)
{
int ret;
%asm {
%asm("LW", "r7", "r0", "3");
%asm("LW", "r7", "r1", "4");
%asm("LI", "r2", "0");
%asm("LI", "r3", "1");
%asm("LI", "r4", "1");
%asm("LI", "r5", "0");
%asm("SLL", "r1", "r1", "1");
%asm("SLTU", "r1", "r0");
%asm("BTNEZ", "-3");
%asm("SLL", "r3", "r3", "1");
%asm("SLTU", "r0", "r1");
%asm("BTNEZ", "3");
%asm("NOP");
%asm("ADDU", "r2", "r3", "r2");
%asm("SUBU", "r0", "r1", "r0");
%asm("SRL", "r3", "r3", "1");
%asm("SRL", "r1", "r1", "1");
%asm("BNEZ", "r3", "-7");
%asm("SLTU", "r0", "r1");
%asm("LW", "r7", "r5", "5");
%asm("SW", "r5", "r0", "0");
%readreg("r2", ret);
};
return ret;
}
int[LimitN + 1] a, result;
int N;
int main()
{
// *(int *)0x6001 = 0x4E;
// *(int *)0x6001 = 0x37;
int i; int j; int k; int q;
int digit;
int last;
int ten;
ten = 10; // to speed up
// initialize the buffer (to perform i!/(2i+1)!! and convolution).
puts("N = "); N = getdec();
for (i = 0; i <= N; i = i + 1)
a[i] = 2;
puts("Please wait while I am computing (about 3 seconds)...\n");
// now we calculate
last = 0;
q = 0;
for (j = N; j > 0; j = j - 1) {
digit = 0;
for (i = j; i > 0; i = i - 1) {
digit = mul(i, digit) + (a[i] << 3) + (a[i] << 1);
k = i + i - 1;
digit = div(digit, k, &(a[i]));
}
int tmp;
div(last + div(digit, ten, &tmp), ten, &(result[q]));
sys_putchar((char)(result[q] + 48));
if (q == 0)
{
sys_putchar('.');
}
q = q + 1;
div(digit, ten, &last);
}
sys_putchar('\n');
// while (1);
return 0;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -