约瑟夫环问题:
import java.util.*;
public class Main {
public static void main(String[] args) {
Scanner in=new Scanner(System.in);
int m=in.nextInt();
String s=in.next();
ArrayList<String> list=new ArrayList<>(Arrays.asList(s.split(",")));//用split将其化为字符串数组
int cnt=0;
String[] ans=new String[list.size()];
int len=0;
while(list.isEmpty()==false) { // 双层while循环
Iterator it=list.iterator();
while(it.hasNext()) {
cnt++; // 用cnt记录相隔个数
if(cnt==m) {//当cnt==m时就将其输入到ans数组中
ans[len++]=(String)it.next();
it.remove();
cnt=0;
}else {
it.next();
}
}
}
for(int i=0;i<len;i++) {//输出ans数组
System.out.print(ans[i]);
if(i<len-1)System.out.print(",");
}
}
}
斗地主的实现:
倒叙输出一个数:
int Reverse_order(int n){
if(0 == n) //递归结束条件
return n;
printf("%d\n",n%10); //当前所求
Reverse_order(n/10); //下一次的传值
return 0;
}
八(n)进制转十进制:
法一:
#include <stdio.h>
int fun(char *p)
{
int i,num,Factorial=1,result=0;
// 声明循环变量i、存储目标数字的num变量,定义存储8的次方的 Factorial 变量、运算结果 result。
for(i = 5;i>=0;i--){
num = p[i]-48; //取出目标数字
//如果用户输入少于6位的数字,则后面的元素会被默认赋上int类型的0值,而非char类型,所以此时num为-48
//这样就可以判断后面的 0究竟是用户输入的还是系统默认赋值的了
//也可以用 for(i=0 ; p[i]!=‘\0’ ; i++); i--; 来找到最后一个元素,这个更好因为这样main函数的数组长度可修改,耦合度低。
if(num!=-48){ //找到第一个非 0 的数字
num *= Factorial;
Factorial *= 8;
result += num;
}
}
return result;
}
int main( )
{
char *p,s[6]; // 用字符数组更方便
p=s;
printf("请输入数字字符串:");
gets(p);
printf("转换成十进制的结果为:%d\n",fun(p));
return 0;
}
法二:
#include <stdio.h>
int fun(char *p)
{
int n = 0;
while(*(p) != '\0'){
n=n*8+*p-'0'; // 如果不是想八进制转十进制,则把8改为原进制进行,前提是输入的数无字母
// 思路:例如输入321,则最终n = ( ( ( 0x8+3 ) x8+2 ) x8+1 ) = 3x8^2 + 2x8^1 + 1x8^0
p++;
}
return n;
}
int main( )
{
char *p,s[6];
p=s;
printf("请输入数字字符串:");
gets(p);
printf("转换成十进制的结果为:%d\n",fun(p));
return 0;
}
法三:
#include <stdio.h>
int main() {
char *p,s[6];
int n;
p=s;
printf("请输入数字字符串:");
gets(p);
n=*p-'0';
while(*(++p)!='\0')
n=n*8+*p-'0';
printf("转换成十进制的结果为:%d\n",n);
return 0;
}
四舍五入:
float a = xxx;
int F = (int)(a+0.5);
四舍五入保留2位小数:
float a = xxx;
x = (int)(a*100+0.5)/100.0; // 先运算括号内的然后强转然后除100.0
// 100.0有小数点是为了把强转后的结果自动类型转为float类型
判断100内(含100)一个数是否为同构数:
正整数n若是它平方数的尾部,则称n为同构数。 0不是同构数。
int fun ( int x ){
if(x == 0 || x == 100){
return 0;
}
else if( x < 10 ){
return !(( x * x - x ) % 10 ); // 整体思路,如果后一位数相同,则相减后面为 0了,对 10求余为 0
}
else{
return !(( x * x - x) % 100); // 整体思路,如果后两位数相同,则相减后面为 00了,对 100求余为 0
}
}
求阶乘:
递归版答案:
int fun(int j)
{
if(j==0) return 1;
else return j*fun(j-1);
}
求X的n次方除以n阶乘的和:
#include <stdio.h>
#include <math.h>
double fun(double x)
{ double f, t; int n;
f = 1.0+x;
t = x;
n = 1;
do {
n++;
t *= x/n; // 妙处,当n=2时,t=(x)*(x/2)=x^2/2!
当n=3时,t=(x^2/2)*(x/3)=x^3/3!
后一个算式是前一个乘 x/n
f += t;
} while (fabs(t) >= 1e-6);
return f;
}
main()
{ double x, y;
x=2.5;
y = fun(x);
printf("\nThe result is :\n");
printf("x=%-12.6f y=%-12.6f \n", x, y);
}
for循环实现x的y次方运算:
int t=1,i;
for(i=1; i<=y; i++){
t=t*x; // 运算一次时,t是x的一次方。运算两次时,t是x的一次方乘x。
运算三次时,t是x的平方乘x。
}
用二维数组的列指针达到循环输入字符串的目的:
#include <stdio.h>
#define MAXLINE 20
fun ( char *pstr[6])
{ int i, j ;
char *p ;
for (i = 0 ; i < 5 ; i++ ) {
for (j = i + 1; j < 6; j++) {
if(strcmp(*(pstr+i),*(pstr+j))>0)
// pstr是pstr[0]的地址,但*(pstr+n)等价于pstr[n],即具体某个元素,即一个列指针,指向一个字符串
{
p = *(pstr + i) ;
pstr[i] = pstr[j] ;
// 交换元素值,即交换其对于的不同列指针,使得pstr数组中的元素根据其保存的字符串大小排序。
// 回到main函数输出pstr数组即可让字符串从小到大排序
*(pstr + j) = p ;
}
}
}
}
main( )
{ int i ;
char *pstr[6], str[6][20] ;
for(i = 0; i < 6 ; i++) pstr[i] = str[i] ;
// 注意,这个str不是一维数组,所以str[i]不是具体的元素值,而是一个列指针,指向第 i行(第二维)
// 所以这里是把二维数组中的一维数组的指针(列指针)传给pstr数组的第 i个元素保存起来
printf( "\nEnter 6 string(1 string at each line): \n" ) ;
for(i = 0 ; i < 6 ; i++) scanf("%s", pstr[i]) ;
// 输入原理:pstr[i]是pstr数组的一个元素,是str数组的一个列指针,是一个保存一维数组头元素地址的指针,可以保存一个字符串
fun(pstr) ;
printf("The strings after sorting:\n") ;
for(i = 0 ; i < 6 ; i++) printf("%s\n", pstr[i]) ;
}
十进制转k进制:
#include <stdio.h>
void fun( int m, int k )
{
int aa[20], i;
for( i = 0; m; i++ ) {
aa[i] = m%k;
m /= k;
// 这里运用了int类型相除的特性,如果除不尽,结果就是原数/除数==商+余数/除数,而余数/除数一定是小数,会被弃掉,相当于不要了余数
}
for( ; i; i-- ) // 精髓在用char数组接收各个商按我们想要的顺序输出,而不是通过乘10使其排序之类的
printf( "%d", aa[ i-1 ] );
}
main()
{
int b, n;
printf( "\nPlease enter a number and a base:\n" );
scanf( "%d %d", &n, &b );
fun( n, b );
}
将未在字符串s中出现、而在字符串t中出现的字符,形成一个新的字符串放于u中,u中字符按原字符顺序排列,但去掉重复字符。
#include <stdio.h>
#include <string.h>
void fun (char *s, char *t, char *u)
{ int i, j, sl, tl, k, ul=0; // ul为u字符串中的字符个数
sl = strlen(s); tl = strlen(t);
for (i=0; i<tl; i++) // 控制t字符串的遍历
{ for (j=0; j<sl; j++) // 遍历s中的字符来与t的该字符的比较,看s中有无该字符
if (t[i] == s[j]) break; // 如果相等,证明t中该字符s中有了,则可以判断s的下一个字符
if (j>=sl) // 如果这里运行通过了,说明s字符串已经全扫完了,但都没找到t的这个字符
{ for (k=0; k<ul; k++)
if (t[i] == u[k]) break ; // 与上面同理,表示如果u中已经有了该字符则不再将t的该字符写入u中
if (k>=ul) // 这里如果运行通过,则说明u中不含该字符,可以写入
u[ul++] = t[i] ;
}
}
u[ul]='\0';
}
main()
{ char s[100], t[100], u[100];
printf("\nPlease enter string s:"); scanf("%s", s);
printf("\nPlease enter string t:"); scanf("%s", t);
fun(s, t, u);
printf("The result is: %s\n", u);
}
在字符串str中删除变量c中的字符,有几个删几个,并返回所删字符的个数。
#include <conio.h>
#include <stdio.h>
int MyDelete( char* str, char c )
{
int i, j=0, k=0;
for( i = 0; str[i]; i++ )
if( str[i] != c )
{ str[ j ]= str[i]; j++; } // 学习这种把新字符串赋在旧串的思路
else
k++;
str[j]=0 ;
return( k );
}
main()
{
char string[81], x;
printf("\nPlease enter a string:\n");
gets(string);
printf("\nPlease enter a character: ");
scanf("%c", &x );
printf( "\n\nAfter deleting %d '%c'(s), the string becomes:\n%s\n",MyDelete(string, x), x, string);
}
判断是否为回文数:
#include <stdio.h>
#define N 80
int fun(char *str)
{
int i,j;
for(j=0;str[j]!='\0';j++);
j--; // 找到最后一个元素
for(i=0;i<=j;i++,j--){
if(str[i]!=str[j]){
return 0;
}
}
return 1;
}
main()
{ char s[N] ;
printf("Enter a string: ") ; gets(s) ;
printf("\n\n") ; puts(s) ;
if(fun(s)) printf(" YES\n") ;
else printf(" NO\n") ;
}
求1000内完数和:
int fun()
{
int i,j,s,sum=0;
for(j=2;j<1000;j++){
s=j;
for(i=1;i<j;i++){
if((j%i)==0){
s=s-i;
}
}
if(s==0){
sum=sum+j;
}
}
return sum;
}
Fibonacci数列问题:
#include <stdio.h>
int fun( int t)
{
int f1=0,f2=1,fn;
fn=f1f2;
while(fn<=t){
f1=f2;
f2=fn; // 巧妙之处,类似于数列中相邻的三个元素匍匐前进
fn=f1+f2;
}
}
main()
{ int n;
n=1000;
printf("n = %d, f = %d\n",n, fun(n));
}
读取一段空格分隔的数字
int a[100];
int i=0;
scanf("%d",&a[i]);
while(getchar()!='\n'){
scanf("%d",&a[++i]);
/* getchar()将空格取走后还有空格也不会被scanf()所读入,
因为%d读入的时候会忽略第一个数字前的空格、Tab键等。
所以就算空格有一百个代码也不会出问题。
*/
}